Posted on 2009-12-11 10:47
itVincent 阅读(6357)
评论(3) 编辑 收藏 所属分类:
Java应用
最近客户提出某些业务查询数据的速度特别慢,而且这种情况来的比较突然。
情况:
1.系统最近没有更新
2.数据库结构没有更改
3.没有大量增加过数据
分析:
1.应用服务器问题:尝试把慢的业务的SQL语句取出到mysql命令行执行,速度依然很慢
2.VPN问题:把业务系统数据导出,再导入到本地数据库运行,速度很快,没有出现上述问题
陷入困境,求教于DBA,DBA也很茫然,查看进程,每次执行那些SQL语句进程占用CPU都非常高;没有错误的日志;MYSQL也运行了2个多月没重启过;硬盘也检查过OK的,也怀疑是raid有问题。
查了这么多也没有找到原因,包括mysql和应用服务器都重启过了。
最后DBA说用Analyze Table的方法看看。
语句是:
ANALYZE TABLE MYTABLE;
运行后,问题解决,速度恢复正常。
MySQL 的在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为“散列程度”),它表示某个索引对应的列包含多少个不同的值——如果cardinality大大少于数据的实际散列程度,那么索引就基本失效了。
我们可以使用SHOW INDEX语句来查看索引的散列程度。
TABLE KEY_NAME COLUMN_NAME CARDINALITY
------- -------- ----------- -----------
MYTABLE PRIMARY ORG_ID_FK 10
此时可以看到,MYTABLE 数据有几百,但是CARDINALITY只有10,可见CARDINALITY大大少于数据量,因此这个索引基本起不到作用,例如当查询语句对这个字段用到join连接时,由于索引的失效,查询就会变得很慢。
在使用了ANALYZE TABLE后cardinality被增大到了500,因此查询的性能得到了提高。