日期:2014-05-16  浏览次数:20681 次

MySQL查询耗时过长问题
一、表基本信息如下



无任何外键及索引


二、 查询执行时间问题
1. 执行语句 SELECT Count(MESSAGE_ID) FROM blog_message 耗时9.484s, 记录结果为 180525条记录
2. 执行语句查询最后一条记录 SELECT * FROM blog_message WHERE MESSAGE_ID='1000224687' 耗时0.031s
3. 执行语句查询第一条记录 SELECT * FROM blog_message WHERE MESSAGE_ID='1000000000' 耗时不到 0.000s
4. 执行语句查询中间记录 SELECT * FROM blog_message WHERE MESSAGE_ID='1000116878' 耗时0.031s


问题,总共的数据也才十八万条而已,为什么count的时候耗时将近十秒,而如果在navicat中直接查询表信息的话一下子就可以统计出来总共有多少条记录了。
求原因及改进方案




刚才重新执行了一下,正常情况下查询速度大概是11秒。
执行了一次analyze,速度提升到9秒多。
再执行了一次优化,报告无法优化,自动改成 analyze+recreate ,速度提升到8秒左右





------解决方案--------------------
主键会自动创建索引的,所以这张表上MESSAGE_ID做为主键,MYSQL已经创建了这个字段的唯一索引。

 SELECT Count(MESSAGE_ID) FROM blog_message 是全表/全索引遍历。 所以会花时间比较长。

navicat中直接查询表信息的话一下子就可以统计出来总共有多少条记录了。
这个是通过 information_schema.tables 中的记录得到的信息,并不一定准确,你可以直接 select * from information_schema.tables 也会很快得到相关信息。
------解决方案--------------------
探讨

主键会自动创建索引的,所以这张表上MESSAGE_ID做为主键,MYSQL已经创建了这个字段的唯一索引。

SELECT Count(MESSAGE_ID) FROM blog_message 是全表/全索引遍历。 所以会花时间比较长。

navicat中直接查询表信息的话一下子就可以统计出来总共有多少条记录了。
这个是通过 information_schema.tables 中的……