只支持单条数据的查询。很多时候我们需要更复杂的操作。
特点
设计逻辑
现在mysql使用的是这种索引
改进点以及优势
normal:表示普通索引
unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique
full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
innoDB 引擎中不支持Hash索引。
hash索引一般用于内存数据库,比如memory存储引擎,数据放到内存里,为了加快速度,创建hash索引。
B+ Tree索引和Hash索引区别
InnoDB的B+ Tree可能存储的是整行数据,也有可能是主键的值。
两种情况:如果存储了主键索引,就称之为聚簇索引;如果存储了主键的值而不是主键索引,那就称之为非聚簇索引。
在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引。
因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询。
(后来我才知道,原来这个过程叫做回表)
拿到索引之后,还需要到表根据索引查询一次数据的过程,叫做回表。
覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。
当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。
如,表covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2)。当我们通过SQL语句:select key2 from covering_index_sample where key1 = ‘keytest’;的时候,就可以通过覆盖索引查询,无需回表。
再举个例子:
select id from table_name where name = ‘ZhangSan’.
这种情况下,可以根据 name 索引查询 id,id就是要查询的值,所以不用再查询聚簇索引。直接就能查询出结果。
我们把识别度最高的字段放到最前面。
在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。
所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。
举个例子:加入建了一个联合索引,使用 name 和 age 两列。
1)where name = ?
where age = ?
where name = ? and age = ?
上面会用到索引的有哪些?
答:1)3)
引入了 Index Condition Pushdown(索引下推) MySQL 5.6引入了索引下推优化,默认开启,使用SET optimizer_switch = ‘index_condition_pushdown=off’; 可以将其关闭。官方文档中给的例子和解释如下: people表中(zipcode,lastname,firstname)构成一个索引
SELECT * FROM people WHERE zipcode=‘95054’ AND lastname LIKE ‘%etrunia%’ AND address LIKE ‘%Main Street%’;
如果没有使用索引下推技术
则MySQL会通过zipcode='95054’从存储引擎中查询对应的数据,返回到MySQL服务端,然后MySQL服务端基于lastname LIKE ‘%etrunia%’ 和 address LIKE ‘%Main Street%’ 来判断数据是否符合条件。
如果使用了索引下推技术
则MYSQL首先会返回符合 zipcode='95054’ 的索引,然后根据 lastname LIKE ‘%etrunia%’ 筛选出符合条件的索引后再返回到 MySQL 服务端,然后MySQL服务端基于address LIKE ‘%Main Street%’ 来判断数据是否符合条件,这样返回给MySQL服务端的索引数又会减少。有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。
可以通过explain查看sql语句的执行计划,通过执行计划来分析索引使用情况
查询优化器 一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。
在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案。这个成本最低的方案就是所谓的执行计划。
优化过程大致如下:
1、根据搜索条件,找出所有可能使用的索引
2、计算全表扫描的代价
3、计算使用不同索引执行查询的代价
4、对比各种执行方案的代价,找出成本最低的那一个
参考:
1)https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653202148&idx=1&sn=f7960b73fe099e43a1a291cf62f647ee&chksm=8c99d43ebbee5d28c1399c4ff9162833210ef91be225ae03222903eb4f9cba4f9e8f32c464b7&scene=126&sessionid=1585119435&key=e2ae4c71ebea12457e5f05275121dfa703190783fcc780e78f7a66df198eab57651067fd7a3f1f0c59d8fe2d32003926e2e4200a5b6f2d247915beea0052ced133ee08b1a7b1286502e97df048cc0094&ascene=1&uin=NDYyNzg4MDQw&devicetype=Windows+10&version=62080079&lang=zh_CN&exportkey=AYHkj3VEBOhhK%2B924HRFLME%3D&pass_ticket=x5DQeIsVVJRo3ezSGkXT75p%2FnCamSZ9%2BkMYoh68wbJbUYP2eXC2vE0J2xG6%2FNH9P
2)mysql索引:https://zhuanlan.zhihu.com/p/73204847
实战:https://juejin.im/post/5decb37b6fb9a0161a0c267b