转载尚硅谷 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语句。进而分析。
可以看到字段
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秒。。。看看日志文件有没有该记录
查看慢查询日志文件 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 条。
诊断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 就可以了