优点:
缺点
- 占用物理空间
- 降低表的增删改效率,每次操作都要动态调整索引 索引的作用如果没有索引,会把所有数据加载到内存,依次检索。有了索引对多就只需要读取2-4次磁盘,因为B+树高度一般在2-4层,查询效率大大提升。 什么情况下需要建立索引经常查询、连接、排序的字段,因为索引已经排好序了,加快了排序速度。 什么情况不建立索引
- where条件用不到的字段
- 表数据较少
- 经常增删改
- 参与计算的字段
-
B+树(InnoDB默认)
B+树基于B树,增加从左往右的单向链表,在mysql中进一步优化成双向链表。还优化为只在叶子节点存放数据,使得非叶子节点能存放更多索引,innoDB一页默认大小是16k,一个指针占6个字节,bigint的主键占8个字节,一页总共可以存放1170条索引,假设一条数据大小1k,一个叶子节点存16个数据,那么2层b+树就能存放18720条数据,3层就能存放2190多万条数据,查询效率非常高。
Hash索引
采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中,一般用于精确查找。如果多个键值映射到一个槽位上,就用链表尾插
Hash索引特点
只能用于对等比较,如=、in
- 无法使用索引进行排序
-
Hash索引和B+树索引的区别
hash不支持排序、模糊查询、组合索引
- hash性能不够稳定,因为存在hash冲突生成链表
索引类型
主键索引
唯一、非空唯一索引
可以多个null,防止数据重复插入组合索引
多个字段建立索引全文索引(myISAM)
只能在char、varchar、text字段上使用 索引失效 - 组合索引不满足最左匹配
- 范围查询(!=、>、<)like 左% (主键只有索引字段除外)
- select *、or、order by 的条件不包括主键或where中的字段
- 对索引做运算、隐式转换 最左匹配
- 对(a,b,c)建立索引,只有a生效了,b,c才生效
- a在索引树中全局有序,b,c全局无序,局部有序(a匹配时,再根据b匹配)
回表
概念
一个普通索引在叶子节点上只存有该索引和id,查询的数据不只包含该索引时,需要到节点上找到索引对应的id,再到id的节点上找一次。
主键id为聚簇索引,包含一行的所有数据。所以查询时尽量使用主键查询,不需要回表,效率更高 前缀索引有时需要在很长的字符列上创建所以,这会造成索引特别大且慢,使用前缀索引,对字符串的前几个字符建立索引,以保证较高的索引选择性。 联合索引和单个索引区别多个单列索引在多条件查询时只生效第一个索引,so->联合索引
联合索引(a,b,c)相当于是三个索引{(a,b,c),(a,b),(a)}