关于mysql索引:Mysql索引优化

5次阅读

共计 1423 个字符,预计需要花费 4 分钟才能阅读完成。

建设索引与查问优化

关键字:区分度
  • 组合索引创立
【举荐】建组合索引的时候,区分度最高的在最右边。正例:如果 where a=? and b=?,a 列的简直靠近于惟一值,那么只须要单建 idx_a 索引即可。阐明:存在非等号和等号混合判断条件时,在建索引时,请把等号条件的列前置。如:where c>? and d=? 
那么即便 c 的区分度更高,也必须把 d 放在索引的最前列,即建设组合索引 idx_d_c。
  • 含糊查问
4.【强制】页面搜寻严禁左含糊或者全含糊,如果须要请走搜索引擎来解决。阐明:索引文件具备 B-Tree 的最左前缀匹配个性,如果右边的值未确定,那么无奈应用此索引。
  • order by 查问
【举荐】如果有 order by 的场景,请留神利用索引的有序性。order by  最初的字段是组合索
引的一部分,并且放在索引组合程序的最初,避免出现 file_sort 的状况,影响查问性能。正例:where a=? and b=? order by c;  索引:a_b_c
反例:索引如果存在范畴查问,那么索引有序性无奈利用,如:WHERE a>10 ORDER BY b;  索引 a_b 无
法排序。

笼罩索引优化

波及概念:回表查问,汇集索引,一般索引
  1. 笼罩索引介绍

InnoDB:

  • 有两大索引,汇集索引和一般索引;汇集索引存储行数据,一般索引存储主键值
  • 回表查问,以一般索引查问行的全副数据,必须走两张索引表,先到一般索引获取主键,再到汇集索引获取行数据。
  • 笼罩索引,须要查问的数据在索引信息外面曾经全副蕴含,不须要再回表。

举例
create table user (
id int primary key,
name varchar(20),
sex varchar(5),
index(name)
)engine=innodb;

表 user 的一般索引 name,
查问 1,只有 name 信息,不必回表,因为 nane 曾经在索引中
select name from user where name=’xxx’;
查问 2,sex 信息须要从行记录里获取,须要回表
select name,sex from user where name =’xxx’;

查问 2 的笼罩索引优化,对标 user 建设索引 index(name, sex)

总结: 笼罩索引,就是建设必要的联结索引,查问信息限定在联结索引中,多余的不要查

  1. 笼罩索引典型应用
  • 优化超多分页场景
7.【举荐】利用提早关联或者子查问优化超多分页场景。阐明:MySQL 并不是跳过 offset 行,而是取 offset+N 行,而后返回放弃前 offset 行,返回 N 行,那当
offset 特地大的时候,效率就十分的低下,要么管制返回的总页数,要么对超过特定阈值的页数进行 SQL
改写。正例:先疾速定位须要获取的 id 段,而后再关联:SELECT t1.* FROM  表 1 as t1, (select id from  表 1 where  条件  LIMIT 100000,20) as t2 where t1.id=t2.id

解读: 如果用 SELECT t1.* FROM 表 1 LIMIT 100000,20; 间接查问,要取 100020 行,返回最初 20 行,速度显著比较慢。
正例中:通过子查问,笼罩索引先命中 20 条,而后再 join 两张表就快多了,子查问命中索引,关联操作再通过索引,没有遍历多条记录。

  • 不等于查问。不等于要甚用,mysql 在应用不等于 (!= 或者 <>) 的时候无奈应用索引会导致全表扫描,如果定要须要应用不等于, 请用笼罩索引。

参考资料
mysql 笼罩索引与回表
阿里巴巴 java 开发手册嵩山版
mysql 不等于 优化_Mysql 优化

正文完
 0