MySQL 查询分析及索引

转载尚硅谷 MySQL高级
MySQL 建立索引语句。可以建立单值索引与复合索引。 主键,唯一,外键约束的字段MySQL都会添加约束。

create 【unique】 index 索引名 on 表名(列名...);
alter 表名 add 【unique】 index 索引名 on (列名...);

MySQL 查看索引

show index from 表名;

MySQL 删除索引

drop index 索引名 on 表名;

索引 帮助MySQL高效获取数据的数据结构,是排好序的快速查找数据结构,索引会影响 where 和 order by。
数据库系统维护者满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级算法,这种数据结构就是索引。

MySQL建立复合索引后使用要符合最佳左前缀原则。 按照建立索引时顺序 使用, 最前列不可少,中间不能断。

对查询比较慢的语句进行Explain或Desc分析
explain和desc关键字会模拟优化器执行sql查询语句,从而知道MySQL如何处理sql语句。进而分析。
Explain和DESC
可以看到字段
id select_type table type possible_keys key ken_len rows Extra等

  • id 实际执行顺序 id 越大越先执行 id相同 执行从上到下
  • select type 查询类型 包含 simple(简单查询) primary(任何包含复杂子查询的最外层查询) subquery(select 或 where列表中包含了子查询) derived(在from列表中包含了子查询被标记为DERIVE的衍生,mysql递归执行这鞋子查询把结果放在临时表中) union(若第二个select语句出现在union之后则被标记为union,若union包含在from字句子查询中外层select标记为derived) unionresult(从union表中获取结果的select)等
  • table 操作的表
  • type 查询使用了那些类型 system>const>eq_ref>ref>range>index>all
  • possible_keys 可能用到了索引
  • key 实际用到的索引
  • key_len 表示索引中使用的字节数 可通过计算查询中使用的索引的长度。在不损失精度前提下,长度越短越好。是索引字段的最大可能长度,并非实际使用长度。
  • ref 显示索引的那一列被使用了。如果可能的话,是一个常数。
  • rows 根据表统计信息即索引选用情况,大直沽算出找到所需记录须读取的行数。
  • Extra 不适合出现在其他列的十分重要的额外信息。可能出现以下信息
    • Using filesort mysql使用了外部的索引排序而不是按照表内索引顺序进行读取。mysql无法利用索引完成的排序操作称为 “文件排序” (不好
    • Using temporary 使用了临时表保存中间结果。MySQL在对查询结果排序时使用了临时表。常见于order by和分组查询 group by。 (不好
    • Using Index 使用了索引覆盖,效率不错。如果同时出现using where 表明索引被用来 执行键值的查找。

关键字段 有 id type key rows extra

获取执行较慢的SQL语句。可以通过开启慢查询日志来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值得SQL,会被记录到慢查询日志。默认情况下MySQL数据库没有开启慢查询日志,需手动开启。注,只在有优化需要的时候开启。

show variables like '%slow_query_log%';

慢查询日志

默认是关闭的,开启后符合条件的查询语句会写入上图所示文件。可以在配置文件中修改。。。
开启慢查询日志

set global slow_query_log=1; 

这样设置只对当前服务有效,若MySQL重启,就会失效。永久配置还是在配置文件修改。
开启

可以查看默认阀值时间并设置为3秒。当次修改完成后重新开启一个会话才会生效。session与global是不同的。

show variables like 'long_query_time';
set global long_query_time=3;

可以测试一下休眠4秒。。。看看日志文件有没有该记录
休眠4秒

查看慢查询日志文件 cat …
已经存在刚才的查询

MySQL提供了日志分析工具 mysqldumpslow。具体使用。。。自行搜索吧。
mysqldumpslow --help 查看参数
如 返回记录集最多的10个SQL

mysqldumpslow -s r -t 10 /var/lib/mysql/feng-virtual-machine-slow.log 

查询

Show Profile查询分析
mysql提供的用来分析当前会话中语句执行的资源消耗情况,可以用于SQL调优的测量。
默认情况下 参数处于关闭情况,开启后默认保存最近15 次运行结果(默认情况下是不保存的)。

show variables like 'profiling';
set profiling=on;

当 开启后 可以查询最近执行的SQL语句

show profiles;

15条记录

默认保存15 条。

诊断SQL show profile cpu,block io for query ID; #ID 就是query_ID 的数字

show profile cpu,block io for query 5;

查询结果
可以看到完整的生命周期 。。。
需注意的是当出现
converting HEAP to MyIASM 查询结果太大内存都不够用了往磁盘上搬
Creating tmp table 创建临时表(需要拷贝数据到临时表 使用完再删除) 耗时。
Copying to tmp table on disk 把内存中临时表复制到磁盘 危险!
locked

全局查询日志 永远不要在生产环境开启
编码开启 设置为表 后 可以通过 select 语句查看

set global general_log=1; #  开启全局查询日志
set global log_output='TABLE'; # 设置日志保存为 表格式 默认是 FILE

开启后所写的SQL语句会记录到mysql库中general_log表可以查看

select * from mysql.general_log;

配置设置开启 可以保存到一个文件中。
一般不要开启全局查询日志。。。。使用profile 就可以了

发布了59 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dandanfengyun/article/details/97650793