MySQL(二)——索引相关面试题

  1. 索引是什么?有哪些优缺点?
    答:
    索引是一种能帮助MySQL提高查询效率的数据结构。
    优点:
    1)快速访问数据表中的特定信息,调高检索速度
    2)创建唯一性索引,保证数据表中每一行数据的唯一性
    3)加速表与表之间的连接
    4)使用分组和排序进行数据检索时,可以显著减少查询中分组和排序的时间
    缺点:
    1)虽然提高了查询速度,但是降低了更新表的速度,比如update、insert,在更新数据时,MySQL不仅要更新数据,还要更新索引文件
    2)建立索引会占用磁盘文件的索引文件

  2. 使用索引的注意事项?
    答:
    1)使用短索引,短索引不仅可以提高查询速度,更能节省磁盘空间和I/O操作
    2)索引列排序,MySQL查询只使用一个索引,因此如果where子句已经使用了索引的话,那么order by中的列是不会使用索引的,因此数据库默认排序可以符合要求的情况下,不要使用排序操作
    3)一般情况下不使用like语句操作,如果非使用不可,注意like"%aaa%"不会使用索引;而like"aaa%"会使用索引
    4)不要在列上进行运算
    5)尽量不要使用not和<>操作

  3. 为什么MySQL官方建议使用自增主键作为表的主键?
    答:
    因为自增主键是连续的,在插入勾·过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分,并且自增主键都是插入到最后,所以自增主键作为表的主键,对于表的操作来说性能是最高的

  4. 自增主键有哪些优缺点?
    答:
    优点:
    1)数据存储空间小
    2)性能最好
    3)减少页分裂
    缺点:
    1)数据量过大,可能会超出自增长取值范围
    2)无法满足分布式存储,分库分表的情况下无法合并表
    3)主键有自增规律,容易被破解
    所以是否需要使用自增主键,需要根据自己的业务场景来设计。如果是单库单表,则优先考虑自增主键

  5. 索引有几种类型?分别如何创建?
    答:
    MySQL 的索引有两种分类方式:逻辑分类和物理分类。
    按照逻辑分类,索引可分为:
    1)主键索引:一张表只能有一个主键索引,不允许重复、不允许为 NULL;
    2)唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,但是一个唯一索引只能包含一列,比如身份证号码、卡号等都可以作为唯一索引;
    3)普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入;
    4)全文索引:让搜索关键词更高效的一种索引
    按照物理分类,索引可分为:
    1)聚集索引:一般是表中的主键索引,如果表中没有显示指定主键,则会选择表中的第一个不允许为 NULL 的唯一索引,如果还是没有的话,就采用 Innodb 存储引擎为每行数据内置的 6 字节 ROWID 作为聚集索引。每张表只有一个聚集索引,因为聚集索引的键值的逻辑顺序决定了表中相应行的物理顺序。聚集索引在精确查找和范围查找方面有良好的性能表现(相比于普通索引和全表扫描),聚集索引就显得弥足珍贵,聚集索引选择还是要慎重的(一般不会让没有语义的自增 id 充当聚集索引);
    2)非聚集索引:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同(非主键的那一列),一个表中可以拥有多个非聚集索引

  6. 主索引和唯一索引有什么区别?
    答:
    1)主索引不能重复且不能为空,唯一索引不能重复,但可以为空
    2)一张表只能有一个主索引,但可以有多个唯一索引
    3)主索引的查询性能要高于唯一索引

  7. 在InnoDB中主键索引为什么比普通索引的查询性能高?
    答:
    因为普通索引的查询会多执行一次检索操作。比如主键查询

select * 
from t 
where id =10;

只需要搜索id的这棵B+树,而普通索引查询

select *
from t
where f = 3;

会先查询f索引树,得到id之后再去搜索id的B+树,因此多进行了一次检索,所以执行效率就比主键索引要低

  1. 什么叫回表查询
    答:
    普通索引查询到主键后,回到主键索引树搜索的过程,成为回表查询。同问题7

  2. MySQL中最多可以创建多少索引列?如何查询一张表的所有索引?
    答:
    MySQL中最多可以创建16个索引列
    查询表T所有索引:

SHOW INDEX FROM T;
  1. MySQL中联合索引是什么?作用是?
    答:
    联合索引又叫符合索引,MySQL中的联合索引,遵循最左匹配原则,比如,联合索引为key(a,b,c),则能触发索引的搜索组合是a , ab , abc这三种查询
    作用如下:
    1)用于多字段查询,比如,建了一个 key(a,b,c) 的联合索引,那么实际等于建了 key(a)、key(a,b)、key(a,b,c) 等三个索引,对大数据量的表来说,这可以减少一部分不必要的开销;
    2)覆盖索引,比如,对于联合索引 key(a,b,c) 来说,如果使用
select a,b,c from table where a=1 and b = 1 

就可以直接通过遍历索引取得数据,而无需回表查询,这就减少了随机的 IO 操作,减少随机的 IO 操作,可以有效的提升数据库查询的性能,是非常重要的数据库优化手段之一;
3)索引列越多,通过索引筛选出的数据越少

  1. 什么是最左匹配原则?它的生效原则有哪些?
    答:
    最左匹配原则是MySQL中的一个重要原则,说的是索引以最左边的为起点任何连续的索引都能匹配上,当遇到范围查询(<、<、between、like)就会停止匹配。比如表中有一个联合索引字段index(a,b,c):
    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;

  2. 列值为NULL时,查询会使用到索引吗?
    答:
    在 MySQL 5.6以上的InnoDB存储引擎会正常触发索引。但为了兼容低版本的MySQL和兼容其他数据库存储引擎,不建议使用NULL值来存储和查询数据,建议设置列为NOT NULL,并设置一个默认值

  3. 索引的常见存储算法有哪些?
    答:
    1)哈希存储法:以 key、value 方式存储,把值存入数组中使用哈希值确认数据的位置,如果发生哈希冲突,使用链表存储数据;
    2)有序数组存储法:按顺序存储,优点是可以使用二分法快速找到数据,缺点是更新效率,适合静态数据存储;
    3)搜索树:以树的方式进行存储,查询性能好,更新速度快

  4. 唯一索引和普通索引哪个性能更好?
    答:
    对于查询操作来说:普通索引和唯一索引的性能接近,都从索引树中进行查询
    对于更新操作来说:唯一索引要比普通索引执行的慢,因为唯一索引需要先将数据读取到内存中,再在内存中进行数据的唯一校验,所以执行起来要比普通索引慢

  5. InnoDB为什么要使用B+树,而不是B树、Hash、红黑树或二叉树?
    答:
    因为B树、Hash、红黑树或二叉树存在以下问题:
    1)B树:不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;
    2)Hash:虽然可以快速定位,但是没有顺序,IO复杂度高;
    3)二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高;
    4)红黑树:树的高度随着数据量增加而增加,IO代价高。

  6. 优化器选择查询索引的影响因素有哪些?
    答:
    优化器的目的是使用最小的代价选择最优的执行方案,影响优化器选择索引的因素如下:
    1)扫描行数:扫描的行数越小,执行代价就越少,执行效率就越高
    2)是否使用了临时表
    3)是否排序

  7. 如何优化身份证的索引?
    答:
    在中国因为身份证前6位代表的是地区,所以很多人前6位都是相同的,如果我们使用前缀索引为6位的话,性能提升也不是很明显,但如果设置的位数过长,那么占用的磁盘空间就越大,数据页能放下的索引值就越少,搜索效率也就越低。所以优化方案有以下两种:
    1)使用身份证倒序存储,这样设置前六位的意义就很大了
    2)使用hash值,新创建一个字段用于存储身份证的hash值

你可能感兴趣的:(MySQL(二)——索引相关面试题)