登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  php教程

MySQLshop_id索引失效原因及解决

时间:2025-02-26 18:54:13 346浏览 收藏

本文分析了MySQL索引失效的案例,探讨了`ns_delivery_shop`表中`shop_id`索引在特定查询条件下失效的原因。 尽管`ns_delivery_shop`表创建了`idx_shop_id`索引,但当执行`SELECT stock FROM ns_delivery_shop WHERE shop_id = 1`时,索引失效,MySQL选择全表扫描。 这主要是因为满足条件的数据量占比超过了MySQL优化器设定的阈值,优化器认为全表扫描效率更高。文章将深入分析索引失效的机制,并针对大数据量场景下索引失效问题提供解决方案。

MySQL索引失效:为什么shop_id索引在特定查询条件下失效?

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会认为全表扫描效率更高,从而选择忽略索引。 这与数据量大小和数据分布有关。 在小数据量的情况下,这个阈值的影响可能不明显。 但随着数据量的增加,如果符合条件的数据占比过高,索引就可能被优化器放弃。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>