转载尚硅谷 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 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;
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 就可以了