前缀索引
MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度。但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index)。
复合索引
集一个索引包含多个列(最左前缀匹配原则)
唯一索引
索引列的值必须唯一,但允许有空值
全文索引
在MySQL 5.6版本以前,只有MyISAM存储引擎支持全文引擎.在5.6版本中,InnoDB加入了对全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL内置了ngram全文解析器,用来支持亚洲语种的分词.
全文索引为FUllText,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值,全文索引可以在CHAR,VARCHAR,TEXT类型列上创建
主键索引
设定主键后数据会自动建立索引,InnoDB为聚簇索引
单列索引
即一个索引只包含单个列,一个表可以有多个单列索引
覆盖索引
覆盖索引是指一个查询语句的执行只用从所有就能够得到,不必从数据表中读取,覆盖索引不是索引树,是一个结果,当一条查询语句符合覆盖索引条件时候,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后的回表操作,减少了I/O效率

列名解析:
| 列名title | 解释desc | 取值value |
|---|---|---|
| table | 索引对应表的名称 | DB中的表 |
| Non_unique | 索引包含value是否为唯一(是否为唯一索引) | 0代表是唯一,1代表不是 |
| Key_name | 索引的名称 | 不命名为创建时列名称,联合查询为Seq_in_index为1的列名称,重复是使用_+number区分 |
| Seq_in_index | 索引中列的序列号,从1开始,表明在联合查询中的顺序,我们可以根据这个推断出联合索引中索引的前后顺序(使用最左优化原则) | 从1递增至联合索引的列数 |
| Column_name | 索引的列名 | 索引的列名 |
| Collation(n.排序方式,校队) | 指排序方式 | A表示升序,B表示降序,NULL表示未排序。 |
| Cardinality | 基数的意思,表示索引中唯一值的数目的估计值,我们知道某个字段的重复值越少越适合建立索引,所以我们一般根据Cardinality来判断索引是否具有高选择性,如果这个值非常小,就需要评估这个字段是否适合做索引 | 最小值为1,表示索引的列字段值都重复,最大为表中字段数 |
| Sub_part | 当索引是前缀索引的时候,sub_part表示前缀的字符数 | 非前缀为0,前缀索引为字符数 |
| Packed | 指示关键字如何被压缩。 | 如果没有被压缩,则为NULL |
| NUll | 如果列含有null,则含有yes | null/yes |
| Index_type | 表示索引类型,全文索引是Fulltext,Memory引擎对应Hash,其他大多数是Btree,Rtree没有见过 | FULLTEXT,HASH,BTREE,RTREE |
| Comment | 注释 | … |
| Index_comment | 注释 | … |
删除索引

删除前:

删除后:

单列索引
普通的索引,没有什么介绍

唯一索引
当索引的列是unique的时候,会生成唯一索引,唯一索引关于null有下列两种情况
SQLSERVER 下的唯一索引的列,允许null值,但最多允许有一个空值


MYSQL下的唯一索引的列,允许null值,并且允许多个空值

会建立两个索引,一个非聚簇索引,一个是唯一索引

可以插入两个空值(明人不说暗话,我喜欢MySQL)
前缀索引

前缀索引实例的博文:
复合索引的最左前缀匹配原则:
对于复合索引,查询在一定条件才会使用该索引

我们插入进去的时候,数据的id都是乱序的,为什么这里最后select查询出来的结果都是进行了排序?
这是因为InnoDB索引底层实现的是B+tree,B+tree具有下列的特点:
和B-tree一样是自平衡树
m个子树上层有m个中间节点,但是m个中间节点只保存索引,而不保存数据。
所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。
所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。
所以上面的排序是为了使用B+tree的结构,B+tree为了范围搜索,将主键按照从小到大排序后,拆分成节点。后续还有新的节点进入的时候,和B-tree相同的操作,会进行分裂。

一般来说,聚簇索引的B+tree都是三层
B-tree是所有结点都要存储数据,相同的数据更深,查找速度变慢,所以底层没有使用B-tree。
MySQL的InnoDB存储引擎设计时顶层页目录常驻内存,对于2-4层B+树查询时,聚簇索引IO查询1-3次,也就是和硬盘交互进行IO读
计算一个元素的字节大小:**字段类型所占字节 + 一个指针的字节数(32位4byte,64位8byte)
实际单表列过多要拆表,这样主表存数据更多深度也低,查询也快
对于InnoDB来说主键索引就是聚簇索引,而普通索引就是非聚簇索引
对于表中数据操作过多会造成存在许多的页碎片,关于碎片整理可以看我这篇博文

为什么这里辅助索引叶子结点不直接存储数据呢?
MYISAM只有非聚簇索引,索引最终指向的都是物理地址。

Q:既然有回表的存在,那么聚簇索引的优势在哪里?
Q:主键索引作为聚簇索引需要注意什么
查询语句中使用Like关键字
在查询语句中使用LIke关键字进行查询时,如果匹配字符串的第一个字符为"%",索引不会使用。如果“%”不是在第一位,索引就会使用
查询语句中使用多列索引
多列索引是在表的多个字段上创建的索引,满足最左前缀匹配原则,索引才会被使用
查询语句中使用OR关键字
查询语句只有Or关键字时候,如果OR前后的两个条件都是索引,这这次查询将会使用索引,否则Or前后有一个条件的列不是索引,那么查询中将不使用索引
5.关于Explain语句
作者不会,建议查找,这里列出是作为提醒
永远年轻,永远热泪盈眶
TIPS:MySQL底层存储文件:
MyISAM:.frm是存放表结构的文件,.MYD是存放表数据的文件,.MYI是存放表索引的文件
InnoDB:.frm存放表结构,.Ibd是存放表数据和索引的
到此这篇关于详解MySQL索引机制及原理的文章就介绍到这了,更多相关MySQL索引机制内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!