当前位置: 代码迷 >> PHP >> MYSQL的一个表中的数据已经达到了2000万条 怎么能更近一步优化
  详细解决方案

MYSQL的一个表中的数据已经达到了2000万条 怎么能更近一步优化

热度:692   发布时间:2012-04-14 17:14:21.0
MYSQL的一个表中的数据已经达到了2000万条 如何能更近一步优化
MYSQL的一个表中的数据已经达到了2000万条
数据查询很慢很慢了, 不知道如何改进?

现在的方法都是做了很多缓存表,但是数据都不实时了。

我执行这样一条语句 select max(id) from unit_keywords 用了 7 秒,机器性能比较好,64位,4核,8G内存

------解决方案--------------------
检查主键和索引的构造是否正确。

难道是用文字作主键?

2000万虽然多,也不至于7秒啊。


------解决方案--------------------
检查 mysql配置文件吧。
也许你的配置是小型数据库用的
------解决方案--------------------
2000W就这样,性能还这么高,看看mysql buffer的设置

不行就分表处理吧
------解决方案--------------------
这个问题其实不该在PHP版发,事实上应该找DBA和系统架构师来帮你解决问题。

从select max(id) from table需要7s的问题来看,就主流做法将id作为自增长主键的来考虑,也是有可能的,这意味着你的业务遭遇了锁竞争。 (这个字段如果不是主键或者索引,2000万行下7s返回倒真得说你的机器配置挺不错了)
我想应该是你们的业务同时存在对这个表进行SELECT、INSERT和UPDATE的操作,甚至还可能会有DELETE。 事实上,很多业务为了追求性能,是采用MySql的MyISAM表,并将业务进行优化,仅保留SELECT和INSERT操作的。 这是因为INSERT无需锁表,而SELECT之间也不会互锁。 至于需要更新数据的问题,完全可以通过将需要更新的字段剥离到新表中,对新表进行UPDATE的方法来进行(当然,这是在UPDATE操作并不太频繁的情况下,太频繁的话就没有意义了)。

另外就是根据业务的查询子句,建立相应的索引。 MySql的Explain指令可以起到很大的参考作用。
而缓存表的问题,则建议你们通过另外的缓存服务比如APC或者Memcache之类来实现,并确保在更新数据的同时对缓存进行更新。

不清楚你的表结构,只是说明些常见做法。 如果可以的话,建议你将show create table的结果放出来会更利于分析。 
  相关解决方案