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,因此查询的性能得到了提高。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值