mysql 索引 index

87 阅读2分钟

mysql 索引

索引是什么?

类比图书的类目

索引带来哪些好处

1、减少mysql 服务器要扫描的数据量。

比如,数据库中有100 w 条记录,其中有个 size 字段创建了普通索引,如果是按照size进行过滤,不需要扫描全表,扫描指定size值的存储块。

2、帮助mysql 服务器对数据排序和避开临时表使用。

索引,是按照单调性排序号的,如果使用了索引,mysql 服务器不需要对数据进行排序。

3、将随机的IO转变为有序IO .

索引缺点:

1、创建索引和维护索引时候的性能开销,数据量越大性能开销越大

2、索引占用磁盘空间

3、操作记录数的时候,也需要同步维护索引,响应时长加大。

索引底层数据结构

MyISAM 存储引擎,索引底层采用的数据结构是 hash表 ;

InnoDB 存储应用,底层采用的数据结构是 B+树 。

索引底层是选择的B+数存储结构 (针对 innodb 存储引擎)

why 选择B+树?

1、数据检索效率,树的深度

2、数据维护时候,索引变动消耗和复杂度

3、数的倾斜

4、存储的数据量

从上面4个维度分析,对象不同数据结构的差异.B+ 树是B的一个改进,解决了存储数据量问题。B+数非叶子节点不存储数据,只存储索引值;只在叶子节点存储数据。

对比 二叉树、AVL树,红黑树、B树和B+树的差异。

mysql 索引的分类

1、 主键索引

2、唯一索引

3、普通索引

4、全文索引

5、组合索引

聚簇索引和非聚簇索引

聚簇索引,索引信息和数据信息都存,叫聚簇索引。

非聚簇索引,只存储索引信息,不存储数据信息,叫非聚簇索引。

回表

索引覆盖

最左匹配

索引下推

执行计划

explain

索引失效

索引合并

低版本没有索引合并,高版本有索引合并功能

索引页分裂和索引页合并

索引优化

1、索引列查询时不使用表达式

触发索引失效,从而走全表扫描

2、尽量使用主键查询,而不是使用索引查询

主键查询不会触发回表

3、推荐使用全值匹配

4、使用索引扫描实现实现排序

order by 后面跟的列推荐加索引,实现排序

5、 union all , in ,or 可以使用索引,推荐使用 union all 和 in

6、范围列可以使用索引

7、连表查询推荐不超过3张表

8、尽量使用覆盖索引,减少回表

9、like 模糊匹配,导致索引失效,会触发全表扫描,推荐使用前缀匹配

10、