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);

索引失效的 sql

当 shop\_id = 1 的条数小于等于 2 时可以使用索引,大于 2 时索引失效
EXPLAIN    SELECT stock FROM `ns_delivery_shop` WHERE shop_id = 1

分析结果

阅读 1.5k
2 个回答

当查询数据量占比总数据量超过一定阈值,MySQL会觉得扫描全表更快,选择不走索引

以下纯属猜测
CBO优化器的问题
1.数据上的问题,<=2的是3条,大于2的也是三条,通过计算索引量下的数据对比全表数据,发现是3/6=0.5,这个索引的选择性是0.5,一般越接近1,这个索引的选择性越好,效率越高。0.5的选择性不高,导致没有选择索引而全表扫描
2.可能你的表统计信息没有更新,你试着执行下ANALYZE TABLE xxx更新下统计信息,看看会不会有变化

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题