MySQL数据库查询变慢的分析及解决过程

最近客户提出某些业务查询数据的速度特别慢,而且这种情况来的比较突然。

情况:
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,因此查询的性能得到了提高。 

你可能感兴趣的:(数据库)