1.主索引和唯一索引有什么区别?

a.主索引不能重复且不能为空,唯一索引不能重复,但可以为空;

b.一张表只能有一个主索引,但可以有多个唯一索引;

c.主索引的查询性能要高于唯一索引。

2.在 InnDB 中主键索引为什么比普通索引的查询性能高?

因为普通索引的查询会多执行一次检索操作。比如主键查询 select * from t where id=10 只需要搜索 id 的这棵 B+ 树,而普通索引查询 select * from t where f=3 会先查询 f 索引树,得到 id 的值之后再去搜索 id 的 B+ 树,因为多执行了一次检索,所以执行效率就比主键索引要低。

3.什么叫回表查询?

普通索引查询到主键索引后,回到主键索引树搜索的过程,我们称为回表查询。

create table T(id int primary key, k int not null, name varchar(16),index (k))engine=InnoDB;

如果语句是 select * from T where ID=500,即主键查询方式,则只需要检索主键 ID 字段。如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 500,再到 ID 索引树搜索一次,这个过程称为回表查询。也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

4.如何查询一张表的所有索引?

SHOW INDEX FROM T 查询表 T 所有索引。

5.MySQL 最多可以创建多少个索引列?

MySQL 中最多可以创建 16 个索引列。

6.以下 like 查询会使用索引的是哪一个选项?为什么?

A.like '%A%' B.like '%A'C.like 'A%' D.以上都不是

答:C 题目解析:like 查询要走索引,查询字符不能以通配符(%)开始。

7.如何让 like %abc 走索引查询?

我们知道如果要让 like 查询要走索引,查询字符不能以通配符(%)开始,如果要让 like %abc 也走索引,可以使用 REVERSE() 函数来创建一个函数索引,查询脚本如下:

select * from t where reverse(f) like reverse('%abc');

8.MySQL 联合索引应该注意什么?

联合索引又叫复合索引,MySQL 中的联合索引,遵循最左匹配原则,比如,联合索引为 key(a,b,c),则能触发索引的搜索组合是 a|ab|abc 这三种查询。

9.联合索引的作用是什么?

a.用于多字段查询,比如,建了一个 key(a,b,c) 的联合索引,那么实际等于建了key(a)、key(a,b)、key(a,b,c)等三个索引,我们知道,每多一个索引,就会多一些写操作和占用磁盘空间的开销,尤其是对大数据量的表来说,这可以减少一部分不必要的开销

b.覆盖索引,比如,对于联合索引 key(a,b,c) 来说,如果使用 SQL:select a,b,c from table where a=1 and b = 1 ,就可以直接通过遍历索引取得数据,而无需回表查询,这就减少了随机的 IO 操作,减少随机的 IO 操作,可以有效的提升数据库查询的性能,是非常重要的数据库优化手段之一;

c.索引列越多,通过索引筛选出的数据越少。

10.什么是最左匹配原则?它的生效原则有哪些?

最左匹配原则也叫最左前缀原则,是 MySQL 中的一个重要原则,说的是索引以最左边的为起点任何连续的索引都能匹配上,当遇到范围查询(>、

where a=1 只使用了索引 a;where a=1 and b=2 只使用了索引 a,b;where a=1 and b=2 and c=3 使用a,b,c;where b=1 or where c=1 不使用索引;where a=1 and c=3 只使用了索引 a;where a=3 and b like 'xx%' and c=3 只使用了索引 a,b。