MYSQL的一个表中的数据已经达到了2000万条
数据查询很慢很慢了, 不知道如何改进?现在的方法都是做了很多缓存表,但是数据都不实时了。我执行这样一条语句 select max(id) from unit_keywords 用了 7 秒,机器性能比较好,64位,4核,8G内存

解决方案 »

  1.   

    select max(id) from unit_keywords ,这个要7s?mysql配置有问题吧
      

  2.   

    检查 mysql配置文件吧。
    也许你的配置是小型数据库用的
      

  3.   

    2000W就这样,性能还这么高,看看mysql buffer的设置不行就分表处理吧
      

  4.   

    如果上面的大侠所说的你都试过了还是不行可以试一下用下面的办法
    用一个表来记录最大的哪个ID
    给unit_keywords表加一个触发器添加数据把ID更新到记录最大ID的哪个表就行.
      

  5.   

    select * from unit_keywords where id = 具体数字这样的用多久?要是也慢 那就不用想了  看看你的配置吧
      

  6.   

    这个问题其实不该在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的结果放出来会更利于分析。 
      

  7.   

    改为MyISAM表可以提高查询速度