
MySQL索引失效场景分析
本文分析一个MySQL索引失效的案例,并探讨其原因。
数据库表结构如下:
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);INSERT INTO `ns_delivery_shop`(`id`, `goods_id`, `sku_id`, `shop_id`, `stock`, `sales`, `create_time`) VALUES (2, 86, 100, 1, 15, 10, 1613960196);INSERT INTO `ns_delivery_shop`(`id`, `goods_id`, `sku_id`, `shop_id`, `stock`, `sales`, `create_time`) VALUES (3, 86, 101, 1, 25, 10, 1613960196);INSERT INTO `ns_delivery_shop`(`id`, `goods_id`, `sku_id`, `shop_id`, `stock`, `sales`, `create_time`) VALUES (4, 101, 119, 9, 30, 5, 1613960196);INSERT INTO `ns_delivery_shop`(`id`, `goods_id`, `sku_id`, `shop_id`, `stock`, `sales`, `create_time`) VALUES (5, 101, 119, 11, 30, 5, 1613960196);INSERT INTO `ns_delivery_shop`(`id`, `goods_id`, `sku_id`, `shop_id`, `stock`, `sales`, `create_time`) VALUES (6, 101, 119, 12, 30, 5, 1613960196);
执行以下查询语句时,索引idx_shop_id失效:
EXPLAIN SELECT stock FROM `ns_delivery_shop` WHERE shop_id = 1;
失效原因分析:
索引失效的原因是当满足shop_id = 1条件的数据量占总数据量的比例超过MySQL优化器预设的阈值时,MySQL会认为全表扫描效率更高,从而选择忽略索引。 这与数据量大小和数据分布有关。 在小数据量的情况下,这个阈值的影响可能不明显。 但随着数据量的增加,如果符合条件的数据占比过高,索引就可能被优化器放弃。
以上就是MySQL索引失效:为什么shop_id索引在特定查询条件下失效?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1252877.html
微信扫一扫
支付宝扫一扫