MYSQL数据库索引

/ 默认分类 / 没有评论 / 124浏览

索引

基本概念

此部分将快速理解什么是索引,为什么索引速度快

什么是索引

​ 数据库索引是一种数据结构,可以提高表中操作的速度。可以使用一列或多列创建索引,这为快速随机查找和对记录访问的有效排序提供了基础。

​ 用户看不到索引,它们仅用于加速查询,并且数据库搜索引擎将使用它们非常快速地定位记录。

​ 如下比方很是合适

​ 假设您有一本有关数据库的书,并且想要查找有关存储的信息。没有索引(假设没有其他帮助,例如目录),则必须逐个浏览页面,直到找到主题(即full table scan)为止。

​ 索引包含关键字列表,因此您可以查阅该索引,并storage在第113-120,231和354页中看到该索引。然后,您可以直接翻到这些页面,而无需进行搜索(即使用索引,速度更快)。

​ 以下情况例外:

​ 1. 如果您有一本关于数据库的书并为“数据库”一词建立了索引,您会发现它在第1-59,61-290页和第292至400页中提到。在这种情况下,索引并没有太大帮助,它可能更快地一页一页地浏览

​ 您必须知道的第一件事就是索引是一种避免扫描整个表以获得所需结果的方法。

​ 2. 对于一本10页的书来说,建立索引是没有意义的。该表是如此之小,以至于执行表扫描要比扫描索引查找要快得多。

​ FROM stackoverflow

​ 索引有不同种类,它们是在存储层中实现的,因此它们之间没有标准,它们也取决于使用的存储引擎。

​ 大多数MySQL索引(PRIMARY KEYUNIQUEINDEXFULLTEXT)存储在 B树。该索引按排序顺序存储元素。另外,您不必访问实际表即可获取索引值,这使查询返回速度更快。

还有一个使用索引查询的问题

关于该索引类型的“问题”是,您必须查询最左边的值才能使用索引。因此,如果索引有两列,例如last_name和first_name,则查询这些字段的顺序非常重要

因此,给定下表:

CREATE TABLE person (
    last_name VARCHAR(50) NOT NULL,
    first_name VARCHAR(50) NOT NULL,
    INDEX (last_name, first_name)
);

该查询将利用索引:

SELECT last_name, first_name FROM person
WHERE last_name = "John" AND first_name LIKE "J%"

但是下面的一个不会

SELECT last_name, first_name FROM person WHERE first_name = "Constantine"

因为您first_name要先查询该列,所以它不是索引中最左边的列。

最后一个例子更糟:

SELECT last_name, first_name FROM person WHERE first_name LIKE "%Constantine"

因为现在,您正在比较索引中最右边字段的最右边部分。

​ FROM stackoverflow

为什么索引速度快

1:转到列表的中间-高于或低于我要查找的内容?

2:如果较高,则到达中间和底部之间的中点;如果较低,则到达中间和顶部之间的中点

3:是更高还是更低?再次跳到中间点,依此类推。

使用该逻辑,您可以在大约7个步骤中在排序列表中找到一个元素,而不用检查每个项目。

显然有复杂性,但这给了您基本的想法。

​ FROM stackoverflow

==使用索引的目的就是避免全表扫描。==

番外

mysql8 存储引擎