手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2008年08月12日的文章

PHP 4官方支持结束

自2000年5月22日发布正式稳定版8年之后,8月8日标志着PHP 4生命的终结,官方不再提供支持,不会再有安全补丁发布。PHP 4.4.9是PHP 4.x的最后一个版本。管理员和开发者失去了最后一个不升级到新一代版本开发环境的理由。过去几年,PHP 5提供了多种升级的途径,它的最新版本是5.2.6。但PHP 4发布8年之后,仍然有相当多的系统将不会在未来迁移到PHP 5,其中有相当的一部分可能永远也不会升级到PHP 5。
 对于那些不升级到新版PHP的用户,PHP专家Stefan Esser将通过Suhosin项目继续为PHP 4.x系列提供第三方安全补丁。

Tags: php, 支持, 终结

[分享]mysql数据库索引查询优化的分享

问题描述:


我们要访问的表是一个非常大的表,四千万条记录,id是主键,program_id上建了索引。
执行一条SQL:

select * from program_access_log where program_id between 1 and 4000

这条SQL非常慢。
我们原以为处理记录太多的原因,所以加了id限制,一次只读五十万条记录

select * from program_access_log where id between 1 and 500000 and program_id between 1 and 4000

但是这条SQL仍然很慢,速度比上面一条几乎没有提升。
Mysql处理50万条记录的表,条件字段还建了索引,这条语句应该是瞬间完成的。


问题分析:


这张表大约容量30G,数据库服务器内存16G,无法一次载入。就是这个造成了问题。
这条SQL有两个条件,ID一到五十万和Program_id一到四千,因为program_id范围小得多,mysql选择它做为主要索引。
先通过索引文件找出了所有program_id在1到4000范围里所有的id,这个过程非常快。
接下来要通过这些id找出表里的记录,由于这些id是离散的,所以mysql对这个表的访问不是顺序读取。
而这个表又非常大,无法一次装入内存,所以每访问一条记录mysql都要重新在磁盘上定位并把附近的记录都载入内存,大量的IO操作导致了速度的下降。

问题解决方案:
1. 以program_id为条件对表进行分区
2. 分表处理,每张表的大小不超过内存的大小
然而,服务器用的是mysql5.0,不支持分区,而且这个表是公共表,无法在不影响其它项目的条件下修改表的结构。
所以我们采取了第三种办法:

select * from program_access_log where id between 1 and 500000 and program_id between 1 and 15000000

现在program_id的范围远大于id的范围,id被当做主要索引进行查找,由于id是主键,所以查找的是连续50万条记录,速度和访问一个50万条记录的表基本一样

总结:
这是一个在千万笔记录表中由于使用了索引导致了数据查找变慢的问题,有一定的典型性和大家交流下!

————END————

索引这个东西很害人的。好的时候很好。。。用的不好。那真的是害己害人啊。

本来来自:PHP5研究室,责编:抽烟的蚊子,网址:http://www.phpv.net/html/1624.html

Tags: mysql, database, 索引, 优化, 技巧