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值

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343