如何正确的使用索引 mysql索引怎么实现

学习索引主要是为了写更快的sql 。我们写sql的时候,需要清楚的知道sql为什么要带索引 。为什么有些sql不带索引?Sql将遍历这些索引 。为什么?我们需要了解它的原理和内部具体流程,这样才能更方便地使用它,写出更高效的sql 。在本文中,我们只是了解这些问题 。

在阅读这篇文章之前,你需要知道一些事情:
什么是索引?mysql索引原理详解mysql索引管理详解如果你还没有看过以上三篇文章,那你最好读一读,否则下面的内容就很难理解了 。
我们先来复习一些知识 。
在本文中,我们以innodb存储引擎为例来说明 。
mysql使用B树存储索引信息 。
B树结构如下:

如何正确的使用索引 mysql索引怎么实现


说说B树的一些特点:
叶子节点(最底层)存储关键字(索引字段的值)信息和对应的数据,叶子节点存储所有记录的关键字信息 。
其他非叶节点只存储子节点的关键字信息和指针 。
每个叶子节点相当于mysql中的一个页面,同一级别的叶子节点以链表的形式连接 。
每个节点(页面)中存储多条记录,记录以单链表的形式连接起来形成有序链表,按照索引字段排序 。
在B树中检索数据时:每次检索都是从根节点开始,总是需要树叶 。
InnoDB的数据是以数据页为单位读写的 。也就是说,当需要读取一条记录时,并不是从磁盘中读取记录本身,而是以页为单位将整条记录加载到内存中 。一页中可能有多条记录,然后在内存中搜索该页 。在innodb中,默认情况下每页的大小是16kb 。
MySQL中的索引分为
聚集索引(主键索引)
每个表都必须有一个聚集索引,整个表的数据存储以B树的形式存储在一个文件中,以B叶的子节点中的键作为主键值,数据作为完整的记录信息;非叶节点存储主键的值 。
通过聚簇索引检索数据,只需要按照B树的搜索过程,即可以检索到对应的记录 。
非聚集索引
每个表可以有多个非聚集索引,采用B树结构,其中叶节点的键是索引字段的值,数据是主键的值;非叶节点只存储索引字段的值 。
通过非聚集索引检索记录时,需要两次操作,首先从非聚集索引中检索主键,然后从聚集索引中检索主键对应的记录,这比聚集索引多了一次操作 。
怎么索引?为什么有些查询没有索引?为什么不用函数来索引数据呢?
这些问题可以先放一放 。我们来看B树检索数据的过程,属于原理部分 。了解了B树的各种数据检索流程后,就可以理解上述问题了 。
这个查询被索引通常是什么意思?
当我们检索一个字段的值时,如果能够快速定位到目标数据所在的页面,有效减少页面的io操作,而不需要扫描所有的数据页面,我们认为这种情况可以有效地使用索引,也就是所谓的索引 。如果在此过程中无法确定这些页面中的数据,我们认为该索引对于此查询是无效的 。
B树中的数据检索过程
唯一记录检索
如何正确的使用索引 mysql索引怎么实现


如上图,所有数据都是唯一的 。查询105记录的过程如下:
将P1页加载到内存在内存中采用二分法查找,可以确定105位于[100,150)中间,所以我们需要去加载100关联P4页将P4加载到内存中,采用二分法找到105的记录后退出查询一个值的所有记录 。
如何正确的使用索引 mysql索引怎么实现


如上图,查询105所有记录的过程如下:

推荐阅读