- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
数据库索引面试题及答案
1.什么是数据库索引?它的核心作用是什么?
答案:索引本质是数据库表中一列/多列值的“排序数据结构”(比如B+树、哈希表),相当于书的“目录”。核心作用有两个:一是加速查询(比如查用户ID=100的记录,不用全表扫描,直接通过索引定位);二是保证数据唯一性(比如主键索引,避免重复值)。但要注意,索引会拖慢插入/删除/更新操作(因为要同步维护索引结构)。
2.常见的索引类型有哪些?分别适用于什么场景?
答案:主要分4类,场景差异很明显:
主键索引:表的主键自动创建,唯一且非空,适合“按主键查数据”(比如用户表按user_id查详情);
普通索引:自定义的单字段索引(比如给订单表order_no加索引),适合“单字段高频查询”;
联合索引:多字段组合的索引(比如订单表给user_id+create_time加联合索引),适合“多字段组合查询”(比如查用户A在2024年的订单);
唯一索引:字段值唯一但可空(比如给用户表phone加唯一索引),适合“既要保证唯一性,又允许空值”的场景(比如部分用户没填手机号)。
3.B+树索引和哈希索引的区别是什么?为什么InnoDB默认用B+树?
答案:区别主要在3点:
查询方式:哈希索引只能“等值查询”(比如whereid=10),无法范围查询(比如whereid10);B+树支持等值+范围查询(因为叶子节点是有序链表);
排序能力:哈希索引无序,查出来的结果要额外排序;B+树叶子节点有序,按索引查直接出排序结果;
冲突处理:哈希索引可能出现哈希冲突(不同值算出来同一个哈希值),需要链表/红黑树解决;B+树不会有冲突。
InnoDB默认用B+树,是因为业务中“范围查询”太常见(比如查最近7天的订单、查价格在100-200的商品),B+树刚好能高效支持,而哈希索引在这些场景下完全没用。
4.聚簇索引和非聚簇索引的区别?InnoDB和MyISAM在这方面有什么不同?
答案:核心区别是“索引是否和数据存一起”:
聚簇索引:索引结构和数据直接存在同一个文件里,索引的叶子节点就是实际数据行(比如InnoDB的主键索引)。查聚簇索引时,找到索引就拿到了数据,不用再跳转到其他地方;
非聚簇索引:索引和数据分开存,索引叶子节点存的是“数据的地址”(比如MyISAM的所有索引)。查非聚簇索引时,要先找索引拿到地址,再去数据文件里取数据(这步叫“回表”)。
引擎差异:InnoDB只有“聚簇索引”(主键索引),其他索引(普通、联合)都是非聚簇索引,且非聚簇索引叶子节点存的是“主键值”(不是数据地址);MyISAM没有聚簇索引,所有索引都是非聚簇索引,叶子节点存数据地址。
5.联合索引的“最左前缀原则”是什么?举个例子说明。
答案:最左前缀原则是指:联合索引(比如a,b,c)只对“从最左边第一个字段开始的查询条件”生效,中间跳过字段就会失效。
例子:给表加联合索引(user_id,order_type,create_time):
生效的查询:whereuser_id=100(用了a)、whereuser_id=100andorder_type=2(用了a+b)、whereuser_id=100andorder_type=2andcreate_time2024-01-01(用了a+b+c);
失效的查询:whereorder_type=2(没从a开始)、whereuser_id=100andcreate_time2024-01-01(跳过了b,只有a生效,c不生效)。
6.哪些情况不适合建索引?为什么?
答案:3种典型情况:
小表/数据量极少(比如只有100行的配置表):全表扫描比查索引还快,建索引反而浪费存储;
高频更新的字段(比如订单表的“支付状态”,每秒更新几百次):每次更新都要同步改索引,会严重拖慢更新速度;
重复率极高的字段(比如用户表的“性别”,只有男/女/未知3个值):索引过滤性太差,查出来还是要扫大部分数据,不如全表扫描。
7.写SQL时,哪些操作会导致索引失效?举个例子。
答案:5个常见操作:
对索引字段用函数(比如whereSUBSTR(phone,1,3)=138,phone是索引字段);
索引字段类型转换(比如wherephonephone是varchar类型,没加引号);
用“不等于”(!=、)或“notin”(比如wherestatus!=1);
用“
文档评论(0)