数据库索引设置及命中

本文探讨了数据库索引的不同类型,包括主键、唯一、普通、全文和空间索引。重点在于联合索引的命中问题,通过多个SQL查询示例分析了不同条件组合下索引的使用情况,如字段类型匹配、查询顺序等对索引命中率的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数据库索引的类型

  1. 主键索引

  2. 唯一索引

  3. 普通索引

  4. 全文索引

  5. 空间索引

二、索引命中

  1. 主要讨论下联合索引命中的问题

数据准备:假设我们有如下图所示的数据库表study_goods_size,并且我们设置goods_id和size_id为联合索引,即:idx_goods_size。

CREATE TABLE `study_goods_size` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `goods_id` varchar(50) NOT NULL DEFAULT '' COMMENT '商品Id',
  `goods_name` varchar(50) NOT NULL DEFAULT '' COMMENT '商品名称',
  `size_id` varchar(100) NOT NULL DEFAULT '' COMMENT '尺码Id',
  `size_name` varchar(100) NOT NULL DEFAULT '' COMMENT '尺码名称',
  PRIMARY KEY (`id`),
  KEY `idx_goods_size` (`goods_id`,`size_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1;

联合索引命中总结
场景SQL是否命中索引其他
场景1explain select * from study_goods_size where goods_id = 123 and size_id = 234;   NO 
场景2explain select * from study_goods_size where goods_id = '123' and size_id = 234;YES 
场景3explain select * from study_goods_size  where goods_id = 123 and size_id = '234';NO 
场景4explain select * from study_goods_size  where goods_id = '123' and size_id = '234';YES 
场景5explain select * from study_goods_size  where size_id = '234' and goods_id = '123' ;YES 
场景6explain select * from study_goods_size  where goods_id = '123';YES 
场景7explain select * from study_goods_size  where goods_id = 123;NO 
场景8explain select size_id from study_goods_size  where goods_id = 123;YES 
场景9explain select size_id from study_goods_size  where goods_id = '123';YES 
场景10explain select size_id from study_goods_size;YES 

 

  • 情况一:explain select * from study_goods_size where goods_id = 123 and size_id = 234;   

结果:不能命中索引,实测情况如下图所示:

  • 情况二:explain select * from study_goods_size  where goods_id = '123' and size_id = 234;

  • 情况三:explain select * from study_goods_size  where goods_id = 123 and size_id = '234';

  • 情况四:explain select * from study_goods_size  where goods_id = '123' and size_id = '234';

  • 情况五:explain select * from study_goods_size  where size_id = '234' and goods_id = '123' ;

  • 情况六:explain select * from study_goods_size  where goods_id = '123';

  • 情况七:explain select * from study_goods_size  where goods_id = 123;

  • 情况八:explain select size_id from study_goods_size  where goods_id = 123;

  • 情况九:explain select size_id from study_goods_size  where goods_id = '123';

  • 情况十:explain select size_id from study_goods_size;

【参考资料】

  1. 索引类型参考:https://www.cnblogs.com/zhenghengbin/p/11908268.html
  2. 如何检测MySql是否命中索引:https://blog.youkuaiyun.com/ba_qi/article/details/88799093
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值