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。