如何定位并优化慢查询sql
具体场景需要具体分析,主要思路如下
- 根据慢日志定位慢sql
- 使用explain工具分析sql
- 修改sql尽量让SQL走索引
Mysql操作过程
使用语句SHOW VARIABLES LIKE '%quer%'
查看数据库参数
根据SHOW STATUS LIKE '%slow_queries%'
查看系统 状态中慢查询的数量(只是本次会话的慢sql条数)
- 将慢查询日志开关打开(该操作和下面一条操作才重启mysql后会失效,如果想永久保存需要到数据库配置文件中修改)
SET GLOBAL slow_query_log = ON;
- 将慢日志设定时间设为1s(需要)
SET GLOBAL long_query_time = 1;
- 创建一个慢查询
- 进入慢日志查看
- 使用explain分析
- 优化
修改sql语句,让sql语句走索引(在account上建有索引)
若必须使用name字段name可以在name上建立索引
- 问题:统计会走那个索引呢
select account(id) from_info_large
通过explain可以发现走的是account而不是id,因为mysql默认会使用查询优化器进行优化。至于为什么选择account作为索引呢?是因为在进行统计和遍历的时候mysql会利用b+ -tree叶子节点之间的连接进行遍历叶子节点(不会从上到下遍历b+数),而id为主键主键上建有聚集索引,每个叶子节点中不但有键值信息还有该行中每一列的信息,这样将导致查询变慢。account上的索引为稀疏索引,只保留键值的信息,信息量较少,查询更快。
当然mysql的查询优化器有时候并不是完全的正确,这时我们就需要强制使用我们自己想要使用的key作为索引