sql查询慢的解决思路
第一步:根据日志定位慢查询sql
1.首先查看一下数据库中的变量(设置)
在mysql中执行,show VARIABLES like '%quer%',其中
slow_query_log:慢sql日志是否开启
slow_query_log_file:日志文件内容
long_query_time:sql执行多久被视为慢sql
在mysql中执行,show STATUS LIKE '%slow_queries%',这个变量的含义为,慢sql执行的数量(次数)。
2. 打开慢sql日志
执行,set GLOBAL show_query_log = ON 即可打开开关。
将sql执行时间设置为想要的秒数。
set GLOBAL long_query_time = 1 (可以设置自己想要的描述)
设置完成之后需要重新连接数据库查看,设置是否生效。
3. 制造慢sql
准备一张100w+的数据表
编写sql
SELECT `name` FROM person_info_large ORDER BY `name` DESC
打开日志文件
Query_time为sql运行时间。
第二步:使用explain等工具分析sql
主要关心以下连个字段的值:
type:扫描级别,红色为全表扫描
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all
extra:
Using filesort:表示MySql 会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容,可能在内存或者磁盘上进行排序。MySql 中无法利用索引完成排序操作成为"文件排序"。
Using temporary:表示MySql在对查询结果排序是使用临时表。常见于排序order by 和分组查询group by。
第三步:修改sql或者尽量让sql走索引
将查询字段以及排序字段加索引
alter table person_info_large add index idx_name(name)