数据库面试题——索引(一)

谈谈你对索引的理解

索引是一个单独的、存储在磁盘上的数据库结构,包含着对数据表里所有记录的引用指针。使用索引可以快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。

优点:

  1. 通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。

  2. 可以大大加快数据的查询速度,这也是创建索引的主要原因。

  3. 在实现数据的参考完整性方面,可以加速表和表之间的连接。

  4. 在使用分组和排序子句进行数据查询时,也可以显著减少查询中分组和排序的时间。

缺点:

  1. 创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。

  2. 索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。

  3. 当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。

索引有哪几种

  1. 普通索引和唯一索引

    普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。

    唯一索引要求索引列的值唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。

    主键索引是一种特殊的唯一索引,不允许有空值。

  2. 单列索引和组合索引

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

    组合索引是指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。

  3. 全文索引

    全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。

  4. 空间索引

    空间索引是对空间数据类型的字段建立的索引。MySQL使用SPATIAL关键字进行扩展,使得能够用创建正规索引类似的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MyISAM的表中创建。

聚集索引和非聚集索引

聚集索引:

表数据按照索引的顺序来存储,索引项的顺序与表中记录的物理顺序一致。对于聚类索引,叶子节点存储了真实的数据行,不再有单独的数据页。一张表最多只能有一个聚类索引。

非聚集索引:

表数据存储顺序与索引顺序无关。对于非聚集索引,叶节点包含索引字段值以及指向数据页,数据行的逻辑指针。

创建索引的方法

一.create

基本语法:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name  ON table_name (col_name [length],...) [ASC|DESC]

案例: 

CREATE INDEX index_name
ON table_name (column)
USING BTREE;

index_name 是索引的名称,table_name 是要在其上创建索引的表的名称,column1、column2、... 是要在其上创建索引的列的名称。可以在括号中指定多个列。使用using字句设置索引类型,创建了一个 B-tree 类型的索引 

二.alter

基本语法:

ALTER TABLE table_name ADD  [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name[length],...) [ASC|DESC]

案例

ALTER TABLE book ADD UNIQUE INDEX UniqidIdx (bookId);

在bookId字段上建立名称为UniqidIdx的唯一索引

MySQL怎么判断要不要加索引

建议按照如下的原则来创建索引:

  1. 当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列的数据完整性,以提高查询速度。

  2. 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。

只要创建了索引,就一定会走索引吗?

不一定。

比如,在使用组合索引的时候,如果没有遵从“最左前缀”的原则进行搜索,则索引是不起作用的。

判断索引有没有生效

可以使用EXPLAIN语句查看索引是否正在使用。

举例,假设已经创建了book表,并已经在其year_publication字段上建立了普通索引。执行如下语句:

EXPLAIN SELECT * FROM book WHERE year_publication=1990;

EXPLAIN语句将为我们输出详细的SQL执行信息,其中:

  • possible_keys行给出了MySQL在搜索数据记录时可选用的各个索引。

  • key行是MySQL实际选用的索引。

如果possible_keys行和key行都包含year_publication字段,则说明在查询时使用了该索引。

MySQL的索引为什么用B+树?

B+树由B树和索引顺序访问方法演化而来,它是为磁盘或其他直接存取辅助设备设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点,各叶子节点通过指针进行链接。如下图:

B+树索引在数据库中的一个特点就是高扇出性,例如在InnoDB存储引擎中,每个页的大小为16KB。在数据库中,B+树的高度一般都在2~4层,这意味着查找某一键值最多只需要2到4次IO操作,这还不错。因为现在一般的磁盘每秒至少可以做100次IO操作,2~4次的IO操作意味着查询时间只需0.02~0.04秒。

 模糊查询语句中如何使用索引?

方法一:

反转模糊查询的字段,但是注意,对于"%keywork%"的索引,此方法是无效的。

如:

select * from student where name like '%三';

改为:

select * from student where reverse(name) like reverse('%三');

方法二:

like查询百分号前置,并不是100%不会走索引。如果只select索引字段,或者select索引字段和主键,也会走索引的。

猜你喜欢

转载自blog.csdn.net/qq_51118755/article/details/129590933
今日推荐