MySQL索引失效:为何shop_id索引在特定条件下失效?

mysql索引失效:为何shop_id索引在特定条件下失效?

MySQL索引失效案例分析

本文记录并分析一个MySQL索引失效的案例。

表结构

以下为ns_delivery_shop表的结构定义:

CREATE TABLE `ns_delivery_shop` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `goods_id` int(10) NOT NULL COMMENT '商品id',  `sku_id` int(10) NOT NULL COMMENT '商品sku',  `shop_id` int(10) NOT NULL COMMENT '代理商id',  `stock` int(10) NOT NULL COMMENT '库存',  `sales` int(10) NOT NULL COMMENT '销量',  `create_time` int(10) NOT NULL COMMENT '时间',  PRIMARY KEY (`id`),  KEY `idx_shop_id` (`shop_id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='代理商打货表';

登录后复制

测试数据

表中插入以下测试数据:

INSERT INTO `ns_delivery_shop`(`id`, `goods_id`, `sku_id`, `shop_id`, `stock`, `sales`, `create_time`) VALUES(1, 86, 99, 1, 10, 5, 1613960196),(2, 86, 100, 1, 15, 10, 1613960196),(3, 86, 101, 1, 25, 10, 1613960196),(4, 101, 119, 9, 30, 5, 1613960196),(5, 101, 119, 11, 30, 5, 1613960196),(6, 101, 119, 12, 30, 5, 1613960196);

登录后复制

索引失效SQL

观察到以下SQL语句在特定条件下索引失效:当shop_id = 1的记录数量小于等于2时,索引生效;大于2时,索引失效。

EXPLAIN SELECT stock FROM `ns_delivery_shop` WHERE shop_id = 1;

登录后复制

失效原因分析

MySQL优化器在判断是否使用索引时,会根据数据量和查询条件进行成本评估。当满足shop_id = 1条件的记录数量占总数据量的比例超过一定阈值时,MySQL认为全表扫描的效率更高,从而导致索引失效。 这并非索引本身的问题,而是优化器选择的策略。 在数据量较小的情况下,索引的查找开销可能大于全表扫描的开销。

以上就是MySQL索引失效:为何shop_id索引在特定条件下失效?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2498791.html

(0)
上一篇 2025年3月5日 04:47:54
下一篇 2025年2月26日 13:14:00

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论