索引基础和优点

1.索引基础
2.索引的类型
3.索引的优点
4.索引的缺点

正文:

1.索引基础

基础概念:索引是存储引擎用于快速找到记录的一种数据结构
要理解mysql中索引是如何工作的,最简单的方法就是去看看一本书的目录(索引)部分,如果想找到一个特定的标题,一般先会看书的目录(索引),找到对应的页码。
在mysql中,mysql除了存储数据本身之外,还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据解雇就是索引。

假设我们要进行如下查询:
select first_name from actor where actor_id = 5;

假设actor_id字段上有索引,mysql就会使用该索引找到actor_id为5的行,也就是说,如果该列有索引,mysql会在索引上按值进行查找,然后返回包含该值的数据行。

2.索引的类型

(1).B-Tree索引
一般人在讨论索引的时候,那99%说的都是B-Tree索引,他使用B-Tree数据来存储数据。
B-Tree最重要的特点就是,节点的所有值按顺序存储,并且每一个叶子页到根的距离相同,我们都知道,树形结构的查找时间复杂度都为log(n),由于这种结构,Btree索引能够加快数据访问的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。通过比较节点的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值的上线和下限,最终存储引擎要么找到对应的值,要么记录不存在。
B-Tree对索引列是顺序组织存储的,所以很适合范围查找。
例如:在一个基于varchar类型的索引树上,按照字母顺序传递连续的值进行查找是非常合适的,“找出所有A开头的名字”,这样的查找效率会非常高。

假设有如下表
CREATE TABLE db.People (
last_name varchar(255) NOT NULL,
first_name varchar(255) NOT NULL,
birthday date NOT NULL,
gender varchar(255) NOT NULL,
INDEX index_first_name(first_name, last_name, birthday)
);

对于表中的每一行数据,索引中包含了first_name,last_name,birthday的值,如下
image.png

索引的顺序是根据create table语句中定义索引时列的顺序,看一下最后两个条目,因为两个人的名字一样,则根据他们的出生日期来进行排序。

(2).Hash索引
哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列进行计算一个哈希码,然后再去索引中通过哈希码来查找数据的槽。因为是哈希结构,所以查询的我们由此可以知道查询的时间复杂度为O(1),但是它也有以下的限制

哈希索引只支持等值比较,不支持任何范围搜索

哈希索引不是按照索引值顺序进行存储的,因此无法用于排序

哈希索引也不支持部分索引匹配查找,因为哈希索引始终是使用索引的全部内容来进行哈希值计算的。

访问哈希索引的数据非常快,除非有很多哈希冲突,当出现哈希冲突的时候,存储引擎必须遍历链表中的所有行指针,逐行比较,直到找到所有符合条件的行。

如果哈希冲突很多的话,维护索引的代价会很高,例如,如果在某个选择性很低的列上建立哈希索引,那么当从表中删除一行的时候,存储引擎需要遍历对应哈希值的链表中的每一行,找到并删除对银行的应用,冲突越多,代价越大。

3.索引的优点

索引可以让服务器快速定位列表的指定位置,总结下来有三个优点:

1.大大减少了服务器需要扫描的数据量
2.索引可以帮助服务器避免排序和临时表
3.索引可以将随机IO转化为顺序IO

4.索引的缺点

1.实际上索引也是一张表,该表保存了主键和索引字段,并指向实体表的记录,所以索引也是要占空间的
2.虽然索引大大提高了查询的速度,但是会降低表更新的速度,对表进行insert,update,delete的时候,mysql不仅要保存数据,还需要更新索引。(读的快,写得慢。 读得慢,写得快)
3.索引只是提高效率的一个因素,如果你的mysql有大量的数据,就需要花时间建立优秀的索引,或者优化查询语句,甚至可以不走mysql,纯走redis等非关系型数据库。


苏凌峰
73 声望38 粉丝

你的迷惑在于想得太多而书读的太少。