Mysql优化及问题定位,看这一篇就够了( 三 )


system > const > eq_ref > ref > range > index > ALL

  • ALL
ALL 标识全表扫描,我们要避免全表扫描 。
  • index
扫描全部索引数据 。
  • range
扫描一部分索引数据 。使用索引进行范围查询 。一般是 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中
 SELECT * FROM tbl_name   WHERE key_column = 10;  SELECT * FROM tbl_name   WHERE key_column BETWEEN 10 and 20;  SELECT * FROM tbl_name   WHERE key_column IN (10,20,30);  SELECT * FROM tbl_name   WHERE key_part1 = 10 AND key_part2 IN (10,20,30);
  • ref
查询的时候,条件是普通索引等值查询
 SELECT * FROM ref_table WHERE key_column=expr;  SELECT * FROM ref_table,other_table   WHERE ref_table.key_column=other_table.column;  SELECT * FROM ref_table,other_table   WHERE ref_table.key_column_part1=other_table.column   AND ref_table.key_column_part2=1;
  • eq_ref
关联查询的时候,关联的条件使用的是主键或者唯一索引
 SELECT * FROM ref_table,other_table   WHERE ref_table.key_column=other_table.column;  SELECT * FROM ref_table,other_table   WHERE ref_table.key_column_part1=other_table.column   AND ref_table.key_column_part2=1;
  • const
使用主键或唯一索引等值查询 。
 SELECT * FROM index_test WHERE id =1
  • system
表只有一行数据,一般是系统表 。
possible_keys当前查询中可能用到的索引 。
key当前查询用到的真实索引 。当可能走索引插叙,但实际没有用到索引查询,你可能需要去分析表,更新索引统计数据,让索引更有效利用 。
 -- 实际就是更新索引的统计数据,让索引更有效利用,一般在空闲的时候做 。 ANALYZE TABLE table_name;key_len不损失精确性的前提下,越小越好 。
ref哪个字段或常数与 key 一起被使用
rows,重点关注显示此查询一共扫描了多少行,这个是一个估计值 。此值越少性能越好 。
filtered表示此查询条件所过滤的数据的百分比
extra,需要关注extra 包含 Using filesort 和 Using temporary 考虑优化 。
  • Using where
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
  • Useing index
覆盖索引扫描,只扫描了索引数据就拿到了结果 。往往性能不错 。
  • Using temporary
表示 MySQL 需要使用临时表来存储结果集,常见于排序和分组查询或者多表查询,需要考虑优化
  • Using filesort
MySQL中无法利用索引完成的排序操作称为“文件排序”,必须优化
show profileshow profile 可以看到 sql执行在哪块比较耗时,cpu/内存/io 等等
 -- 查看 profile 是否开启,默认是关闭的 。 show variables like '%profil%'; +------------------------+-------+ | Variable_name        | Value | +------------------------+-------+ | have_profiling         | YES   | | profiling            | OFF   | | profiling_history_size | 15  | +------------------------+-------+  -- 开启 profile set profiling=1;  -- 查看已经执行的 sql  SHOW PROFILES;
Mysql优化及问题定位,看这一篇就够了

文章插图
 
 -- show profile cpu, block io, memory,swaps,context switches,source for query [Query_ID]; -- 查看具体某个执行 sql show profile cpu, block io, memory,swaps,context switches,source for query [Query_ID];  -- 先执行 SHOW PROFILES;拿到 query_id 在执行下面的 sql show profile cpu, block io, memory,swaps,context switches,source for query 173;SHOW PROCESSLIST查看数据库线程中的状况 。
Mysql优化及问题定位,看这一篇就够了

文章插图
 
 SHOW PROCESSLIST; SELECT * FROM information_schema.`PROCESSLIST`;结合 top/vmstat/IOStat 可以定位mysql 中 cpu,io,内存相关问题 。
 # 查看 mysqld 的进程 ps -ef | grep mysqld | grep -v grep # 查看 mysqld 中的线程 top -Hp 5762  # 或者一步到位,查看 mysqld 下的线程 top -Hp `ps -ef | grep mysqld | grep -v grep | awk '{print $2}'`


推荐阅读