【MySQL】《MySQL索引核心分类面试高频考点问答清单》(附:《一页纸速记版》)
文章目录《MySQL索引核心分类面试高频考点问答清单》一、基础概念类入门必问Q1MySQL索引的本质是什么核心作用有哪些Q2MySQL常用的索引数据结构有哪些各自特点是什么Q3为什么MySQL选择B树作为默认索引结构而不是B树或红黑树二、物理存储分类核心必问Q4什么是聚簇索引什么是非聚簇索引核心区别是什么Q5InnoDB引擎中聚簇索引是如何实现的如果表没有主键会怎样Q6什么是回表操作为什么InnoDB的二级索引查询需要回表Q7MyISAM和InnoDB在索引实现上有什么主要区别三、逻辑功能分类高频考点Q8主键索引有什么特点设计主键时应该遵循哪些原则Q9唯一索引和主键索引有什么区别Q10什么是二级索引二级索引包含哪些类型四、字段数量分类核心必问Q11什么是联合索引联合索引遵循什么原则Q12联合索引相比多个单列索引有什么优势Q13设计联合索引时应该遵循哪些原则五、特殊优化型索引高频考点Q14什么是覆盖索引覆盖索引有什么优势Q15什么是前缀索引什么时候应该使用前缀索引Q16如何选择合适的前缀长度前缀索引有什么限制六、概念辨析类易混淆考点Q17主键索引和聚簇索引是什么关系Q18二级索引和非聚簇索引是什么关系Q19联合索引和覆盖索引是什么关系七、设计与使用最佳实践高频考点Q20索引设计应该遵循哪些基本原则Q21列举常见的索引失效场景Q22如何判断一个索引是否有效如何优化低效的索引八、进阶考点大厂高频Q23为什么InnoDB不建议使用UUID作为主键Q24什么是索引下推ICP它是如何优化查询性能的Q25什么是MRRMulti-Range Read优化它解决了什么问题《一页纸速记版》一、基础概念速记二、物理存储分类核心必背三、逻辑功能分类四、字段数量分类五、特殊优化型索引六、核心概念辨析七、索引失效场景必考八、设计最佳实践九、进阶优化《MySQL索引核心分类面试高频考点问答清单》一、基础概念类入门必问Q1MySQL索引的本质是什么核心作用有哪些答本质数据库表中一列或多列值进行排序的存储结构通过空间换时间将随机IO转化为顺序IO加速数据操作。核心作用加速数据检索SELECT加速排序ORDER BY和分组GROUP BY加速表连接JOIN通过唯一索引保证数据唯一性Q2MySQL常用的索引数据结构有哪些各自特点是什么答数据结构特点适用场景B树所有数据在叶子节点非叶子节点仅存索引键和指针支持范围查询、排序、分页MySQL默认绝大多数场景哈希索引仅支持等值查询不支持范围、排序、模糊查询查询速度极快Memory引擎纯等值查询全文索引基于倒排索引实现大文本字段的全文检索R树索引用于空间数据类型地理信息查询Q3为什么MySQL选择B树作为默认索引结构而不是B树或红黑树答B树 vs B树B树所有数据都在叶子节点非叶子节点更小相同磁盘页能存储更多索引键树的高度更低通常3-4层B树叶子节点形成双向链表范围查询和排序效率极高B树查询性能更稳定所有查询都要走到叶子节点B树 vs 红黑树红黑树是二叉树树的高度随数据量增长而增加百万级数据高度约20层红黑树不支持范围查询和排序红黑树磁盘IO次数远高于B树二、物理存储分类核心必问Q4什么是聚簇索引什么是非聚簇索引核心区别是什么答聚簇索引将索引结构与数据行物理存储在一起的索引叶子节点直接存储完整的数据行。一个表只能有一个聚簇索引。非聚簇索引索引结构与数据行物理存储分离的索引叶子节点存储索引键和指向数据行的指针或主键值。一个表可以有多个非聚簇索引。核心区别对比维度聚簇索引非聚簇索引数量限制一个表只能有一个一个表可以有多个物理存储索引与数据行存储在一起索引与数据行分离存储叶子节点内容完整的数据行索引键指针/主键值查询速度极快无需回表较快可能需要回表插入速度慢可能导致页分裂快更新代价高更新主键会移动数据低Q5InnoDB引擎中聚簇索引是如何实现的如果表没有主键会怎样答InnoDB中主键索引就是聚簇索引实现规则如果表定义了主键InnoDB会将主键作为聚簇索引的键如果没有定义主键InnoDB会选择第一个唯一非空索引作为聚簇索引如果既没有主键也没有唯一非空索引InnoDB会隐式创建一个6字节的ROWID作为聚簇索引Q6什么是回表操作为什么InnoDB的二级索引查询需要回表答回表操作通过二级索引找到主键值后再根据主键值到聚簇索引中查找完整数据行的过程。原因InnoDB的二级索引叶子节点只存储主键值而不是完整的数据行或数据行的物理地址。因此当查询需要获取索引中没有的列时必须通过主键值去聚簇索引中查找完整数据行。Q7MyISAM和InnoDB在索引实现上有什么主要区别答对比维度InnoDBMyISAM聚簇索引支持主键索引就是聚簇索引不支持二级索引叶子节点存储主键值存储数据行的物理地址指针回表操作需要通过主键查找聚簇索引不需要直接通过指针访问数据索引与数据关系索引与数据存储在同一个文件.ibd索引与数据分离存储.MYI和.MYD三、逻辑功能分类高频考点Q8主键索引有什么特点设计主键时应该遵循哪些原则答特点唯一性主键值必须唯一不允许重复非空性主键值不允许为NULL自动创建定义主键时数据库会自动创建主键索引聚簇特性InnoDB中主键索引决定了数据的物理存储顺序设计原则尽量使用自增整数作为主键如INT AUTO_INCREMENT避免使用过长的字符串作为主键避免使用业务字段作为主键业务字段可能会变化主键值应保持稳定不频繁更新Q9唯一索引和主键索引有什么区别答对比维度主键索引唯一索引唯一性强制唯一强制唯一非空性强制非空允许有一个NULL值数量限制一个表只能有一个一个表可以有多个聚簇特性InnoDB中是聚簇索引非聚簇索引作用标识数据行的唯一性保证列值的唯一性Q10什么是二级索引二级索引包含哪些类型答二级索引辅助索引除了主键索引之外的所有索引都称为二级索引。包含类型普通索引Normal Index最基本的索引没有任何限制唯一索引Unique Index索引列的值必须唯一但允许有一个NULL值全文索引Fulltext Index用于全文检索空间索引Spatial Index用于空间数据类型四、字段数量分类核心必问Q11什么是联合索引联合索引遵循什么原则答联合索引复合索引基于两个或多个列创建的索引索引键由多个列的值按顺序组成。遵循最左前缀原则联合索引的查询条件必须从索引的最左列开始才能使用索引。可以跳过中间的列但不能跳过最左列。示例对于联合索引idx_a_b_c(a, b, c)可以使用索引WHERE a1、WHERE a1 AND b2、WHERE a1 AND b2 AND c3可以部分使用索引WHERE a1 AND c3只使用a列不能使用索引WHERE b2、WHERE c3、WHERE b2 AND c3Q12联合索引相比多个单列索引有什么优势答减少索引数量一个联合索引可以替代多个单列索引减少索引的维护成本和存储空间提高查询效率可以在索引中过滤更多的数据减少回表次数支持覆盖索引更容易实现覆盖索引避免回表操作加速排序和分组如果ORDER BY或GROUP BY的列都包含在联合索引中可以避免文件排序Q13设计联合索引时应该遵循哪些原则答选择性高的列放在前面选择性不同值的数量/总行数选择性越高过滤效果越好经常一起查询的列放在一起如果多个列经常同时出现在WHERE子句中应该创建联合索引长度短的列放在前面可以减少索引的大小提高查询效率避免创建过长的联合索引联合索引的列数不宜超过5个考虑查询的顺序根据业务查询的特点合理安排列的顺序五、特殊优化型索引高频考点Q14什么是覆盖索引覆盖索引有什么优势答覆盖索引如果一个索引包含了查询所需的所有列那么这个索引就称为覆盖索引。覆盖索引不是一种特殊的索引类型而是索引的一种使用方式。优势性能极高避免了回表操作只需要一次B树查找减少IO操作索引通常比数据行小可以减少磁盘IO可以加速排序和分组如果ORDER BY或GROUP BY的列都包含在索引中可以避免文件排序示例CREATEINDEXidx_name_ageONusers(name,age);-- 可以使用覆盖索引SELECTname,ageFROMusersWHEREname张三;-- 不能使用覆盖索引需要回表获取gender列SELECTname,age,genderFROMusersWHEREname张三;Q15什么是前缀索引什么时候应该使用前缀索引答前缀索引只对字符串列的前N个字符创建索引而不是对整个字符串创建索引。适用场景字符串列较长如VARCHAR(255)字符串的前N个字符已经具有足够的选择性对索引大小敏感的场景创建方法-- 对email列的前10个字符创建索引CREATEINDEXidx_email_prefixONusers(email(10));Q16如何选择合适的前缀长度前缀索引有什么限制答选择前缀长度的方法计算不同前缀长度的选择性选择选择性接近整个字符串选择性的最小前缀长度-- 计算整个字符串的选择性SELECTCOUNT(DISTINCTemail)/COUNT(*)FROMusers;-- 计算不同前缀长度的选择性SELECTCOUNT(DISTINCTLEFT(email,5))/COUNT(*)ASselectivity_5,COUNT(DISTINCTLEFT(email,10))/COUNT(*)ASselectivity_10,COUNT(DISTINCTLEFT(email,15))/COUNT(*)ASselectivity_15FROMusers;限制不支持ORDER BY和GROUP BY不支持覆盖索引因为索引中没有存储完整的字符串不能用于LIKE %xxx’查询六、概念辨析类易混淆考点Q17主键索引和聚簇索引是什么关系答在InnoDB中主键索引就是聚簇索引在MyISAM中主键索引是非聚簇索引聚簇索引是物理存储方式主键索引是逻辑功能一个表只能有一个聚簇索引但可以有多个唯一索引Q18二级索引和非聚簇索引是什么关系答在InnoDB中所有二级索引都是非聚簇索引非聚簇索引是物理存储方式二级索引是逻辑功能一个表可以有多个二级索引和多个非聚簇索引Q19联合索引和覆盖索引是什么关系答联合索引是按字段数量分类的索引类型覆盖索引是索引的一种使用方式联合索引更容易实现覆盖索引因为它包含多个列单列索引也可以成为覆盖索引如果查询只需要该列七、设计与使用最佳实践高频考点Q20索引设计应该遵循哪些基本原则答优先考虑联合索引一个联合索引可以替代多个单列索引减少索引数量覆盖索引优先尽量让索引包含查询所需的所有列避免回表操作选择性高的列优先选择性越高索引的过滤效果越好避免创建过多索引过多的索引会降低插入、更新和删除的性能避免在低选择性列上创建索引如性别、状态等只有少数几个值的列避免在频繁更新的列上创建索引更新索引的代价很高使用自增整数作为主键避免页分裂提高插入性能Q21列举常见的索引失效场景答在索引列上使用函数或表达式WHERE YEAR(create_time) 2023在索引列上进行计算WHERE age 1 20使用!或操作符WHERE status! 1使用IS NULL或IS NOT NULLWHERE name IS NULL使用LIKE %xxx’查询WHERE name LIKE %张三字符串不加引号WHERE phone 13800138000phone是VARCHAR类型联合索引不满足最左前缀原则WHERE b2 AND c3索引是idx_a_b_c使用OR连接多个条件WHERE a1 OR b2b列没有索引隐式类型转换如VARCHAR类型的列与数字比较Q22如何判断一个索引是否有效如何优化低效的索引答判断索引是否有效使用EXPLAIN分析执行计划查看type、key、rows、Extra等字段查看索引的使用情况SHOW INDEX FROM table_name;查看慢查询日志找出没有使用索引的查询优化低效的索引删除无用的索引DROP INDEX index_name ON table_name;优化联合索引的列顺序将选择性高的列放在前面增加覆盖索引避免回表操作对于长字符串列使用前缀索引定期分析表和索引ANALYZE TABLE table_name;八、进阶考点大厂高频Q23为什么InnoDB不建议使用UUID作为主键答插入性能差UUID是无序的插入数据时会导致聚簇索引频繁页分裂产生大量碎片索引体积大UUID是128位的比自增整数大很多导致索引体积增大查询效率降低缓存命中率低无序的主键导致数据在磁盘上分散存储缓存命中率低Q24什么是索引下推ICP它是如何优化查询性能的答索引下推Index Condition PushdownMySQL 5.6引入的优化特性允许在存储引擎层使用索引中的列进行条件过滤而不是将所有满足索引前缀条件的数据都返回给MySQL服务层进行过滤。优化原理没有ICP时存储引擎根据索引前缀找到数据返回给服务层服务层再根据其他条件过滤有ICP时存储引擎在遍历索引时直接使用索引中的列进行条件过滤只返回满足条件的数据给服务层优势减少了回表次数和数据传输量提高了查询性能示例对于联合索引idx_name_age(name, age)查询SELECT * FROM users WHERE name LIKE 张% AND age 20;没有ICP时找到所有name以’张’开头的数据回表获取完整数据再过滤age20的记录有ICP时在索引中直接过滤age20的记录只回表获取满足条件的数据Q25什么是MRRMulti-Range Read优化它解决了什么问题答MRR多范围读MySQL 5.6引入的优化特性用于优化二级索引的范围查询。解决的问题二级索引范围查询时回表操作是随机IO性能较差。优化原理先将二级索引查询得到的主键值排序然后按照主键的顺序进行回表操作将随机IO转化为顺序IO提高了查询性能《一页纸速记版》一、基础概念速记本质排序的存储结构空间换时间随机IO→顺序IO核心作用加速查询、排序、分组、JOIN保证唯一性默认数据结构B树所有数据在叶子节点双向链表范围查询快二、物理存储分类核心必背类型核心特点数量叶子节点内容查询代价聚簇索引索引与数据物理在一起1个/表完整数据行无需回表极快非聚簇索引索引与数据分离多个/表索引键主键值(InnoDB)可能需要回表InnoDB聚簇索引规则主键→第一个唯一非空索引→隐式6字节ROWID回表二级索引找主键→聚簇索引找完整数据两次B树查找三、逻辑功能分类主键索引唯一非空InnoDB中就是聚簇索引唯一索引唯一允许1个NULL非聚簇二级索引除主键外的所有索引都是非聚簇索引四、字段数量分类联合索引多列组成遵循最左前缀原则必须从最左列开始联合索引优势减少索引数量、提高过滤效率、易实现覆盖索引设计原则选择性高→经常一起查询→长度短的列放前面五、特殊优化型索引覆盖索引包含查询所有列无需回表性能最高前缀索引字符串前N个字符建索引减少空间前缀长度选择选择性接近完整字符串的最小长度六、核心概念辨析主键索引聚簇索引InnoDB二级索引非聚簇索引InnoDB覆盖索引是使用方式不是索引类型联合索引是索引类型易实现覆盖索引七、索引失效场景必考索引列上用函数/计算使用!、、IS NULL/IS NOT NULLLIKE ‘%xxx’左模糊字符串不加引号隐式类型转换联合索引不满足最左前缀OR连接无索引的列八、设计最佳实践用自增整数做主键避免UUID优先联合索引避免过多单列索引优先覆盖索引减少回表不在低选择性列性别、状态建索引不在频繁更新的列建索引九、进阶优化索引下推(ICP)存储引擎层用索引列过滤减少回表MRR主键排序后回表随机IO→顺序IO
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2605869.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!