索引相关调优知识、explain性能分析、慢查询优化、日志分析工具mysqldumpslow、show profile
A表、B表为列(AB表可做连表查询):
select * from A left join B on a.key=b.key
select * from A right join B on a.key=b.key
select * from A inner join B on a.key=b.key
select * from A left join B on a.key=b.key
union
select * from A right join B on a.key=b.key where A.key is null
优势:
劣势:
适合创建索引的情况:
不适合创建索引的情况:
CREATE INDEX 索引名字 ON 表名(字段名);
CREATE UNIQUE INDEX 索引名字 ON 表名(字段名);
ALTER TABLE 表名 add PRIMARY KEY (主键字段名);
CREATE INDEX 索引名字 ON 表名(字段名1,字段名2);
CREATE [UNIQUE ] INDEX [indexName] ON table_name(column);
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list);
ALTER TABLE tbl_name ADD INDEX index_name (column_list):
DROP INDEX [indexName] ON table_name;
SHOW INDEX FROM table_name;
SHOW INDEX FROM table_name\G

(1)MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具 体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。
(2)具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为 10,意思是运行10秒以上的语句。
(3)由他来查看哪些SQL超出了我们的最大忍耐时间值,比如一条sql执行超过5秒钟,我们就算慢SQL,希望能 收集超过5秒的sql,结合之前explain进行全面分析
默认情况下,MySQL 数据库没有开启慢查询日志,需要我们手动来设置这个参数。
如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。
SHOW VARIABLES LIKE '%slow_query_log%';
# 默认情况下 slow_query_log 的值为 OFF, 表示慢查询日志是禁用的
set global slow_query_log=1;
SHOW VARIABLES LIKE 'long_query_time%';
# 单位秒
set long_query_time=3
# 单位秒,这里是3秒(即超过3秒的sql记录到日志)
# 得到返回记录集最多的 10 个 SQL
mysqldumpslow -s r -t 10 /var/lib/mysql/mysql-slow.log
#得到访问次数最多的 10 个 SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/mysql-slow.log
#得到按照时间排序的前 10 条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/mysql-slow.log
#另外建议在使用这些命令时结合 | 和 more 使用 ,否则有可能出现爆屏情况
mysqldumpslow -s r -t 10 /var/lib/mysql/mysql-slow.log | more
# 查看开启状态 (默认是关闭 OFF)
show variables like '%profiling%'
#开启
set profiling=on;
show profiles;
# Query_ID为show profiles列表中的Query_ID
show profile cpu,block io for query Query_ID;
# 查询cpu开销信息和block io开销信息
show profile cpu,block io for query 15;
①ALL:显示所有的开销信息。
②BLOCK IO:显示块IO开销。
③CONTEXT SWITCHES:上下文切换开销。
④CPU:显示CPU开销信息。
⑤IPC:显示发送和接收开销信息。
⑥MEMORY:显示内存开销信息。
⑦PAGE FAULTS:显示页面错误开销信息。
⑧SOURCE:显示和Source_function,Source_file,Source_line相关的开销信息。
⑨SWAPS:显示交换次数开销信息。
①Converting HEAP to MyISAM:查询结果太大,内存不够,数据往磁盘上搬了。
②Creating tmp table:创建临时表。先拷贝数据到临时表,用完后再删除临时表。
③Copying to tmp table on disk:把内存中临时表复制到磁盘上,危险!!!
④locked。
如果在Show Profile诊断结果中出现了以上4条结果中的任何一条,则SQL语句需要优化。
假设 index(a,b,c);
where a = 3 #使用到 a
where a = 3 and b = 5 and c = 4 #使用到 a,b,c
where a = 3 and c = 5 #使用到 a,但是c不可以,b中间断了
where a = 3 and b > 4 and c = 5 #使用到a 和b,c不能用在范围之后,b断了
where abs(a) =3 # 不能使用索引
where a = 3 and b like 'kk%' and c = 4 #使用到 a,b,c
where a = 3 and b like '%kk%' and c = 4 #只用到 a
全职匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE 百分写最右,覆盖索引不写*;
不等空值还有 OR,索引影响要注意;
VAR 引号不可丢,SQL 优化有诀窍。