Mysql索引原理-简书 深入理解mysql索引( 六 )



explain select id from user order by abs(age); //对应(age)索引
4. 查询优化
4.1 慢查询定位

  • 开启慢查询日志MySQL 数据库是否开启了慢查询日志和慢查询日志文件的存储位置的命令如下:

SHOW VARIABLES LIKE 'slow_query_log%'
通过如下命令开启慢查询日志:
SET global slow_query_log = ON;
SET global slow_query_log_file = 'OAK-slow.log';
SET global log_queries_not_using_indexes = ON;
SET long_query_time = 10;
long_query_time:指定慢查询的阀值,单位秒 。如果SQL执行时间超过阀值,就属于慢查询记录到日志文件中 。log_queries_not_using_indexes:表示会记录没有使用索引的查询SQL 。前提是slow_query_log的值为ON,否则不会奏效 。
  • 慢查询日志
    • 文本方式 直接使用文本编辑器打开slow.log日志即可 。

Mysql索引原理-简书 深入理解mysql索引

文章插图



    • time:日志记录的时间 UserHost:执行的用户及主机 Query_time:执行的时间 Lock_time:锁表时间 Rows_sent:发送给请求方的记录数,结果数量 Rows_examined:语句扫描的记录条数 SET timestamp:语句执行的时间点 select....:执行的具体的SQL语句
  • 使用mysqldumpslow MySQL 提供了一个慢查询日志分析工具mysqldumpslow,可以通过该工具分析慢查询日志内容 。在 MySQL bin目录下执行下面命令可以该使用格式 。

perl mysqldumpslow.pl --help
运行如下命令慢查询日志信息:
perl mysqldumpslow.pl -t 5 -s at C:\ProgramData\MySQL\Data\OAK-slow.log
除了使用mysqldumpslow工具,也可以使用第三方分析工具,比如pt-query-digest、mysqlsla等 。
4.2 慢查询优化
4.2.1 索引和慢查询
  • 如何判断是否为慢查询? MySQL判断一条语句是否为慢查询语句,主要依据SQL语句的执行时间,它把当前语句的执行时间跟long_query_time 参数做比较,如果语句的执行时间 > long_query_time,就会把这条执行语句记录到慢查询日志里面 。long_query_time 参数的默认值是 10s,该参数值可以根据自己的业务需要进行调整 。
  • 如何判断是否应用了索引? SQL语句是否使用了索引,可根据SQL语句执行过程中有没有用到表的索引,可通过 explain命令分析,检查结果中的 key 值,是否为NULL 。
  • 应用了索引是否一定快? 看下面的语句:

select * from user where id>0;
虽然使用了索引,但是还是从主键索引的最左边的叶节点开始向右扫描整个索引树,进行了全表扫描,此时索引就失去了意义 。而像 select * from user where id = 2; 这样的语句,才是我们平时说的使用了索引 。它表示的意思是,我们使用了索引的快速搜索功能,并且有效地减少了扫描行数 。
查询是否使用索引,只是表示一个SQL语句的执行过程;而是否为慢查询,是由它执行的时间决定的,也就是说是否使用了索引和是否是慢查询两者之间没有必然的联系 。我们在使用索引时,不要只关注是否起作用,应该关心索引是否减少了查询扫描的数据行数,如果扫描行数减少了,效率才会得到提升 。对于一个大表,不止要创建索引,还要考虑索引过滤性,过滤性好,执行速度才会快 。
4.2.2 提高索引过滤性
假如有一个5000万记录的用户表,通过sex='男'索引过滤后,还需要定位3000万,SQL执行速度也不会很快 。其实这个问题涉及到索引的过滤性,比如1万条记录利用索引过滤后定位10条、100条、1000条,那他们过滤性是不同的 。索引过滤性与索引字段、表的数据量、表设计结构都有关系 。案例:


推荐阅读