MYSQL 索引
目录一、什么是索引
索引使用的数据结构
B+树的特点
B+树与B树对比
二、MYSQL中的页
为什么要使用页
三、索引分类
主键索引
平常索引
唯一索引
全文索引
聚集索引
非聚集索引
索引覆盖
https://i-blog.csdnimg.cn/direct/7d3cb17f1e9d4b2ca11f7df23d8d59bc.gif
https://i-blog.csdnimg.cn/direct/111b1fced57d490ca923e89c6873fbc3.gif
一、什么是索引
MYSQL是一种数据结构,它可以资助数据库高效地查询、更新数据表中的数据。索引通过一定的规则排列数据表中的记录,使得对表的查询可以通过对索引的查询来加快速率。
MYSQL索引雷同于书籍的目录,通过指向数据行的位置,可以快速定位和访问表中的数据。就像汉语字典中,我们可以按照笔画、偏旁部首、拼音等排序来快速查找到必要的字。
下面这是汉语字典中的笔画检索目录。
https://i-blog.csdnimg.cn/direct/dd8180fbcfa049218ab172e279086421.png
使用索引的目的,就是提高数据检索的效率。
索引使用的数据结构
MYSQL索引使用的数据结构是B+树。
B+树是一种常用于数据库和文件系统等场合的平衡查找树,如图,
https://i-blog.csdnimg.cn/direct/fcb63f8c487c44889a83cfaee9103148.png
B+树的特点
[*]能够保持数据稳定有序,插入与修改有较稳定的时间复杂度
[*]非叶子节点仅具有索引作用,不存储数据,所有叶子节点保存真实数据
[*]所有叶子节点构成一个有序链表,可以按照key排序的序次一次遍历全部数据
[*]时间夫复杂度:O(logN)
B+树与B树对比
[*]叶子节点之间有一个相互连接的引用,可以通过一个叶子节点找到它的兄弟节点。MYSQL在组织叶子节点时使用的是双向链表。
[*]非叶子节点的值都包含在叶子节点中。MYSQL非叶子节点只保存了对子节点的引用,没有保存真实数据,所有真实的数据都保存在叶子节点。
[*]对于B+树而言,在相同树高的情况下,查找任一元素的时间复杂度都一样,性能均衡
二、MYSQL中的页
为什么要使用页
这里可以先提到一个文件的格式 .ibd文件,它是数据库中表的存储方式,
https://i-blog.csdnimg.cn/direct/038b4a75ca414ea29cde49c70ba7fc26.png
https://i-blog.csdnimg.cn/direct/d499411238ba4c04b83a530d29ccc810.png
[*]而在 .ibd文件中最紧张的结构体就是页,页是内存与磁盘交互的最小单元,默认大小为16KB,每次内存与磁盘的交互至少读取一页,所以在磁盘中每个页的地点都是连续的。
[*]每一个页中即使没有数据也会使用16KB的存储空间,同时与索引的B+树种的节点对应。
[*]在MYSQL中有很多种不同类型的页,最常用的就是用来存储数据和索引的“索引页”,也叫做“数据页”,但不论哪种类型的页都会包含页头和页尾,页的主体信息使用数据“行”进行添补
数据页的根本结构如下:
https://i-blog.csdnimg.cn/direct/4901462f784b4b40a37239f4d6520462.png
三、索引分类
主键索引
[*]当在一个表上定义一个主键PRIMARY KEY时,自动创建索引,索引的值是主键列的值,将使用它作为主键索引(聚集索引)。
[*]推荐为每一个表定一个主键。如果没有逻辑上唯一且非空的列或列集可以使用主键,则添加一个自增列。
平常索引
[*]最根本的索引,没有唯一性的限制。
[*]大概为多列创建组合索引,称为复合索引或组合索引
唯一索引
[*]当在一个表上定义一个唯一键UNIQUE时,自动创建唯一索引。
[*]与平常索引雷同,但区别于唯一索引的列不答应有重复值。
全文索引
[*]基于文本列上创建,以加快对这些列中包含的数据查询和DML操作。
[*]用于全文搜索,仅MyISAM和InnoDB引擎支持。
聚集索引
[*]与主键索引是同义词。
[*]如果没有表定义为主键,将会使用第一个 UNIQUE 和 NOT NULL 的列作为聚集索引。
[*]如果表中没有主键 或者 符合的 UNIQUE 索引,将会为新插入的行天生一个行号并用6字节的ROW_ID字段(数据行中的一个隐藏列之一)记录,ROW_ID单调递增,并用其作为索引。
非聚集索引
[*]聚集索引以外的所有索引称为非聚集索引或二级索引。
[*]二级索引中的每条记录都包含该行的主键列,以及二级索引指定的列。
[*]InnoDB使用这个主键值来搜索聚集索引中的行,这个过程叫做回表查询。
索引覆盖
当一个select语句使用了平常索引且查询列表中刚好是创建平常索引时的所有或者部分列,这时就可以直接返回数据,而不用回表查询,这里的现象叫做索引覆盖。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]