MySQL索引详解,面试必问

1、什么是索引?

索引是帮助MySQL高效获取数据的数据结构(有序)。

除了数据之外,数据库系统还维护满足特定查找算法的数据结构,这些查找算法以某种方式引用(指向)数据,从而可以在这些数据结构上实现高级查找算法。这个数据结构就是索引。

[En]

In addition to the data, the database system maintains data structures that meet specific lookup algorithms, which refer to (point to) the data in some way, so that advanced lookup algorithms can be implemented on these data structures. this data structure is the index.

图示:

索引本身也非常大,通常以索引文件的形式存储在磁盘上。

[En]

The index itself is also very large and is generally stored on disk in the form of index files.

2、说一下索引有哪些优势有哪些劣势?

优势:

1、提高数据的查询效率,降低了数据库的IO成本;

2、通过索引列对数据进行排序,可以大大降低排序的成本,即降低了CPU的消耗。

劣势:

1、实际上索引也是一张表,该表中保存了主键和索引字段,并指向实体表的记录,所以索引列也是要占用空间的;

2、虽然索引大大提高了查询效率,但同时也降低了更新表的速度,如对表进行insert,update,delete。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。每次更新或添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

3、介绍一下索引的数据结构?

索引是在MySQL的引擎层中实现的,所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。

MySQL目前提供了以下四种结构的索引:

1、BTREE索引:最常见的索引类型,大部分索引都支持B树索引。

2、HASH索引(了解):只有Memory引擎支持,适用场景简单。

3、R-TREE索引(了解):即空间索引,是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型。

4、Full-text索引(了解):即全文索引,也是MyISAM引擎的一个特殊索引类型,主要用于全文检索,InnoDB从MySQL5.6开始支持全文检索。

我们平常所说的索引,如果没有特别指明,都指的是B+树索引。其中InnoDB引擎,默认使用的就是B+树结构的索引。

4、BTREE索引的检索原理

MySQL索引详解,面试必问

初始化简介:

一颗B+树,浅蓝色的块我们称之为一个磁盘块,每个磁盘块包含几个数据项(深蓝色)和指针(黄色);

如:磁盘块1包含数据项17和35,包含指针P1,P2,P3;

P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块;

真实数据仅存在于叶节点上,即3、5、9、10、13、15、28、29、36、60、75、79、90、99

[En]

Real data exists only on leaf nodes, that is, 3, 5, 9, 10, 13, 15, 28, 29, 36, 60, 75, 79, 90, 99

非叶子节点不存储真实数据,而只存储引导搜索方向的数据项,如:17、35在数据表中并不真正存在。

[En]

Non-leaf nodes do not store real data, but only store data items that guide the search direction, such as: 17, 35 do not really exist in the data table.

查找过程:

如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针;

通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针;

通过磁盘块3的P2指针的磁盘地址把磁盘块8由磁盘加载到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,共计3次IO。

总结:

真实的情况是,3层的B+树可以表示上百万的数据,如果上百万的数据查找只需要3次IO,性能提高将是巨大的;

如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,成本非常高。

5、索引分为哪些类型?

单值索引:即一个索引只包含一列,一个表可以有多个单列索引。

[En]

Single-valued index: that is, an index contains only a single column, and a table can have multiple single-column indexes.

唯一索引:索引列的值必须是唯一的,但允许空值。

[En]

Unique index: the value of the index column must be unique, but null values are allowed.

复合索引:即一个索引包含多个列。

[En]

Composite index: that is, an index contains multiple columns.

6、索引的基本语法?

1、创建索引:

方式1:

create [UNIQUE] index 索引名 on 表名(字段名…);

示例:create [UNIQUE] index idx_city_name on city(city_name);

方式2:

alter table 表名 add index 索引名(字段名…)

示例:alter table city add index idx_city_name(city_name);

2、查看索引:

show index from 表名;

示例:show index from city;

3、删除索引:

drop index 索引名 on 表名;

示例:drop index idx_city_name on city;

7、哪些情况需要创建索引?

1、主键自动建立唯一索引

2、频繁作为查询条件的字段应创建索引

3、查询中与其它表关联的字段,外键关系建立索引

4、查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

5、查询中统计或分组字段

8、哪些情况不需要创建索引?

1、数据量太少

2、经常做增删改频繁操作的的字段

3、数据重复且分布平均的表字段

解释:假如一个表有10万记录,有一个字段只有true和false两种值,且每个值的分布概率大约为50%,那么这个对该字段建索引不会提高查询效率;

索引选择性:索引列中不同值的数量/表记录的数量

[En]

Index selectivity: number of different values in index columns / number of table records

如果一个表中有2000条数据,索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99,选择性越接近1,索引的效率越高。

4、where条件里用不到的字段

Original: https://www.cnblogs.com/xilichenbokeyuan/p/15687544.html
Author: 卫盾
Title: MySQL索引详解,面试必问

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/507956/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球