1. 什么是索引
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引按照不同的维度分为:
数据结构 | B+树,Hash索引,R-Tree等 |
存储层面 | 聚簇索引、非聚簇索引 |
逻辑层面 | 主键索引、普通索引、复合索引、唯一索引、全文索引等 |
1.1 索引为什么能加快数据的查询
相对于cpu和内存操作,磁盘IO开销很大,非常容易成为系统的性能瓶颈,因此计算机操作系统做了一些优化:
当一次IO时,将相邻的数据也都读取到内存缓冲区内,而不是仅仅读取当前磁盘地址的数据。因为局部预读性原理告诉我们,当计算机访问一个地址的数据的时候,与其相邻的数据也会很快被访问到。每一次IO读取的数据我们称之为一页(page),也就是我们读取一页内的数据时候,实际上才发生了一次IO,这个理论对于索引的数据结构设计非常有帮助。
为什么索引能提升数据库查询效率呢?根本原因就在于索引减少了查询过程中的IO次数。那么它是如何做到的呢?使用B+树。
什么是B+树
B+树有几个特点:
1)是多叉而不是二叉了,使用多叉的目的是降低树的高度;
2)每个节点不再只是存储一个key了,可以存储多个key;
3)非叶子节点存储key,叶子节点存储key和数据。
4)叶子节点两两相连,为顺序查询提供了帮助
mysql选择B+树的原因:
- B+树的非叶子节点只是存储key,占用空间非常小,因此每一层的节点能索引到的数据范围更加的广。
- 叶子节点两两相连,符合磁盘的预读特性。
- 支持范围查询,而且部分范围查询非常高效。
1.2 聚簇索引和非聚簇索引
“聚簇”就是表示数据行和相邻的键值紧凑的存储在一起,也就是数据行实际上是存储在索引的叶子页中。
非聚集索引的叶子节点存储了列的值和对应记录的主键的值,按照辅助索引来查询数据的时候,如果没有用到覆盖索引,先从辅助索引文件中获取到数据对应的主键,根据主键从聚集索引中获取真实数据。
联合索引,也称多列所谓,就是建立在多个字段上的索引,这个概念是跟单列索引相对的。联合索引依然是B+树,但联合索引的健值数量不是一个,而是多个。
全文索引:全文索引主要用来查找文本中的关键字,只能在 CHAR、VARCHAR 或 TEXT
类型的列上创建。在 MySQL
中只有 MyISAM
存储引擎支持全文索引。全文索引允许在索引列中插入重复值和空值。
1.3 索引的查看
使用show index from <table>
1.4 建立索引的几大原则
1)最左前缀匹配原则,复合索引遵守「最左前缀」原则,查询条件中,使用了复合索引前面的字段,索引才会被使用。
2)=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序。
3)尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例。
4)索引列不能参与计算,保持列“干净”,否则将导致索引失效而进行全表扫描。
5)尽量的扩展索引,不要新建索引。
6)只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
7)like语句,在like “value%”可以使用索引,但是like “%value%”不会使用索引,走的是全表扫描。