你真的会使用数据库的索引吗?

摘要:使用索引也很简单,然而, 会使用索引是一回事, 而深入理解索引原理又能恰到好处使用索引又是另一回事。

本文分享自华为云社区《索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它》,作者: 曲鸟。

一、前言

无论是面试、还是日常工作中,或多或少都会使用或者听到别人谈论索引这个技术。

然而很大一部份程序员对索引的了解仅限于到“加索引能使查询变快”这个概念为止。

使用索引也很简单,然而, 会使用索引是一回事, 而深入理解索引原理又能恰到好处使用索引又是另一回事。

这已经是两个相差甚远的技术层级了。

二、千万级数据索引和无索引查询效率对比

现在有一个学生student,有1000万条数据

你真的会使用数据库的索引吗?

未加索引,查询class_id=2的学生信息的耗时:SELECT * FROM student WHERE class_id=2 花费了3.357秒

你真的会使用数据库的索引吗?

加上索引,查询class_id=2的学生信息的耗时:SELECT * FROM student WHERE class_id=2 花费了0.017秒

你真的会使用数据库的索引吗?

1000万条数据下,两个查询的性能差了近200倍!!

这个差距是特别大的! 难怪需要加索引!!!

三、什么是索引

网上很多讲解索引的文章对索引的描述是这样的:

索引就像书的目录, 通过书的目录就可以准确的定位到书籍的具体的内容。

这句话概述的非常正确!

但说了跟没说一样,懂的人自然懂!不懂的人感觉懂了,但还是一脸蒙的状态!

其实想要理解索引原理,必须清楚一种数据结构:

平衡树」(非二叉),也就是b tree或者 b+ tree

当然, 有的数据库也使用哈希桶作用索引的数据结构 , 然而, 主流的RDBMS都是把平衡树当做数据表默认的索引数据结构的。

我们平时建表的时候都会为表加上主键, 在某些关系数据库中, 如果建表时不指定主键,数据库会拒绝建表的语句执行。

事实上, 一个加了主键的表,并不能被称之为“表”。一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是上面说的“平衡树”结构,换句话说,就是整个表就变成了一个索引。

没错, 再说一遍, 整个表变成了一个索引!

也就是所谓的“聚集索引”。 这就是为什么一个表只能有一个主键, 一个表只能有一个“聚集索引”,因为主键的作用就是把“表”的数据格式转换成“树(索引)”的格式。

未加索引时,之前执行的查询sql会让数据库系统逐行的遍历整张表,对于每一行都要检查其class_id字段是否等于“2”。因为我们要查找所有class_id为“2”的员工,所以当我们发现了一条class_id是“2”的记录后,并不能停止继续查找,因为可能还有class_id等于“2”的其他记录。

这就意味着,对于表中的千万条记录,数据库每一条都要检查。这就是所谓的“全表扫描”( full table scan)

而加上索引的最大作用就是加快查询速度,它能从根本上减少需要扫表的记录/行的数量。

四、Mysql中的索引

在MySQL中, 索引有两种分类方式:逻辑分类和物理分类。

按照逻辑分类,索引可分为:

主键索引:一张表只能有一个主键索引,不允许重复、不允许为 NULL;

唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,但是一个唯一索引只能包含一列,比如身份证号码、卡号等都可以作为唯一索引;

普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入;

全文索引:让搜索关键词更高效的一种索引。

按照物理分类,索引可分为:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjwsw.html