MySQL索引失效,先记录下

其名
  • 2
新手上路,请多包涵
遇到一个索引失效的问题,先记录下,再研究研究

数据表结构

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

分析结果

评论
阅读 142
2 个回答

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

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

撰写回答

登录后参与交流、获取后续更新提醒

宣传栏