MySQL - 索引

2020-11-25  本文已影响0人  Whyn

索引

对于大多数应用系统,对数据库的读写比例大致在 10:1 左右,也就是查询操作行为远大于插入与更新行为,因此,数据库绝大多数性能问题,往往是出现在查询操作上,尤其是复杂的数据查询操作。

当我们对数据表进行查询时,通常会附带一些字段值作为过滤条件,比如SELECT * FROM table_name WHERE id = 10000,如果直接对表进行查找,则需要从头到尾顺序进行遍历比较,直到找到id = 10000的记录,这种全表扫描查找的时间复杂度为 O(n),对于现在动辄十万百万甚至是千万级别的数据库而言,这种查询速度显然是不可行的。

因此,需要一种机制来满足对数据库的高效查找行为,而这种机制就是 索引(Index)

本质上,索引就是一个具备高效查找的数据结构(比如哈希表、二叉搜索树、B-/B+树...),其执行逻辑可以大致理解为:当对经常查询的一个或多个字段(列)进行索引时,会将该字段各个值与其对应的数据记录地址(物理地址)关联起来,然后,每次进行查询操作时,数据库判断若查询字段已被索引,则会首先从索引文件中获取得到查询字段值对应的记录(即数据行)在磁盘上的地址,然后依据该地址就可以加载到完整记录内容,完成查询操作。比如假设使用哈希索引,那么理论上无论数据表多大,依据查找字段直接以 O(1) 的时间复杂度就可以检索得出记录,查询效率堪称完美。

当然,对于不同的存储引擎,其底层对于数据的存储组织方式不同,因此,对于索引,也有不同的存储结构,但无论是使用哪种结构,这种结构都满足高效查找特性。但是,由于数据库的特殊性,比如存储数据量特别大,导致磁盘 IO 操作特别多,因此不是所有的高效查找数据结构都满足数据库查找要求。比如,常见的高效查找数据结构有如下几种:

此外,数据库索引还涉及以下几个重要的概念:

虽然索引大大提高了查询速度,但同时却也会降低更新表的速度,如对表进行INSERTUPDATEDELETE操作时,MySQL不仅要保存新数据,也要动态更新索引文件(一个关键字的增加、删除或修改可能会导致 B+树 结点大幅度变化)。通常应该只为最经常查询和最经常排序的数据列建立索引。

最后,介绍下在 MySQL 中对索引的常用操作命令:

上一篇 下一篇

猜你喜欢

热点阅读