1、什么是索引?
索引是一种能帮助 MySQL 提高查询效率的数据结构。
2、索引有哪些优点和缺点?
索引的优点如下:
-
快速访问数据表中的特定信息,提高检索速度。
-
创建唯一性索引,保证数据表中每一行数据的唯一性。
-
加速表与表之间的连接。
-
使用分组和排序进行数据检索时,可以显著减少查询中分组和排序的时间。
索引的缺点:
-
虽然提高了的查询速度,但却降低了更新表的速度,比如 update、insert,因为更新数据时,MySQL 不仅要更新数据,还要更新索引文件;
-
建立索引会占用磁盘文件的索引文件。
3、使用索引有哪些注意事项?
-
使用短索引,短索引不仅可以提高查询速度,更能节省磁盘空间和 I/O 操作;
-
索引列排序,MySQL 查询只使用一个索引,因此如果 where 子句中已经使用了索引的话,那么 order by 中的列是不会使用索引的,因此数据库默认排序可以符合要求的情况下,不要进行排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引;
-
like 语句操作,一般情况下不鼓励使用 like 操作,如果非使用不可, 注意 like "%aaa%" 不会使用索引,而like "aaa%"可以使用索引;
-
不要在列上进行运算;
-
不适用 NOT IN 和 <> 操作。
4、索引有几种类型?
MySQL 的索引有两种分类方式:逻辑分类和物理分类。
按照逻辑分类,索引可分为:
-
主键索引:一张表只能有一个主键索引,不允许重复、不允许为 NULL;
-
唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,但是一个唯一索引只能包含一列,比如身份证号码、卡号等都可以作为唯一索引;
-
普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入;
-
全文索引:让搜索关键词更高效的一种索引。
按照物理分类,索引可分为:
-
聚集索引:一般是表中的主键索引,如果表中没有显示指定主键,则会选择表中的第一个不允许为 NULL 的唯一索引,如果还是没有的话,就采用 Innodb 存储引擎为每行数据内置的 6 字节 ROWID 作为聚集索引。每张表只有一个聚集索引,因为聚集索引的键值的逻辑顺序决定了表中相应行的物理顺序。聚集索引在精确查找和范围查找方面相比于普通索引和全表扫描有良好的性能表现,一般不会让没有语义的自增id充当聚集索引;
-
非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同(非主键的那一列),一个表中可以拥有多个非聚集索引。
5、主索引和唯一索引的区别是?
-
主索引不能重复且不能为空,唯一索引不能重复,但可以为空;
-
一张表只能有一个主索引,但可以有多个唯一索引;
-
主索引的查询性能要高于唯一索引。
6、联合索引的作用是什么?
-
MySQL中,每多建一个索引,会多一些写操作和占用磁盘空间的开销,对大数据量的表来说,联合索引可以减少一部分不必要的开销;
-
对联合索引来说,可以直接通过遍历索引取得数据,而无需回表查询,减少了随机的 IO 操作,可以有效提升数据库查询的性能,是非常重要的数据库优化手段之一;
-
索引列越多,通过索引筛选出的数据越少。
7、什么是最左匹配原则?
最左匹配原则也叫最左前缀原则,是 MySQL 中的一个重要原则,指索引以最左边的为起点任何连续的索引都能匹配上,当遇到范围查询(>、<、between、like)就会停止匹配。
8、索引的常见存储算法有哪些?
-
哈希存储法:以 key、value 方式存储,把值存入数组中使用哈希值确认数据的位置,如果发生哈希冲突,使用链表存储数据;
-
有序数组存储法:按顺序存储,优点是可以使用二分法快速找到数据,缺点是更新效率,适合静态数据存储;
-
搜索树:以树的方式进行存储,查询性能好,更新速度快。
9、唯一索引和普通索引哪个性能更好?
-
对于查询操作来说:普通索引和唯一索引的性能相近,都是从索引树中进行查询;
-
对于更新操作来说:唯一索引比普通索引执行的慢,因为唯一索引需要先将数据读取到内存中,再在内存中进行数据的唯一效验,所以执行起来要比普通索引更慢。
10、MySQL 如何指定查询的索引?
可以使用 force index 强行选择一个索引,具体如下:
select * from table force index(index_t)