MySQL like查询后置%索引失效分析

MySQL like查询后置%索引失效分析

表结构

CREATE TABLE `t_food_shop` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `shop_name` varchar(50) NOT NULL DEFAULT '' COMMENT '店铺名称',
  `shop_img` varchar(250) NOT NULL DEFAULT '' COMMENT '店铺图片',
  `category_name` varchar(50) NOT NULL DEFAULT '' COMMENT '品类名称',
  `price` varchar(50) NOT NULL DEFAULT '' COMMENT '消费价格',
  `area` varchar(50) NOT NULL DEFAULT '' COMMENT '所属地区',
  `collects` bigint(11) NOT NULL DEFAULT '0' COMMENT '收藏的数量',
  `shop_type` tinyint(3) NOT NULL DEFAULT '0' COMMENT '店铺的分类(0,蓝丝,1,黄丝)',
  `shop_grade` decimal(3,1) NOT NULL DEFAULT '0.0' COMMENT '店铺评级',
  `address` varchar(128) NOT NULL DEFAULT '' COMMENT '店铺地址',
  `longitude` varchar(16) NOT NULL DEFAULT '' COMMENT '经度',
  `latitude` varchar(16) NOT NULL DEFAULT '' COMMENT '纬度',
  `geo_hash` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT 'geohash',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `openrice_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'openrice 店铺唯一id',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_geohash` (`geo_hash`) USING BTREE,
  FULLTEXT KEY `idx_name` (`shop_name`) /*!50100 WITH PARSER `ngram` */ 
) ENGINE=InnoDB AUTO_INCREMENT=673319 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='美食店铺基本数据表';

查询执行计划

EXPLAIN
select id, shop_name, price, collects, shop_grade, address, longitude, latitude from t_food_shop  where geo_hash like 'wecny%';


image-20200728120002262

geo_hash字段建立了索引,按照前缀查询,但是索引失效了。

“wecny”字符串长度为5,我们就来看看长度为5的字符串的重复率

select count(1) from t_food_shop;
SELECT (count(*) / 63061 ) percent,count(*) cnt,LEFT(geo_hash,5) prefix
FROM t_food_shop GROUP BY prefix ORDER BY percent DESC LIMIT 0,10;

image-20200728120050490

可以看到,前缀为“wecny”的重复率竟然占到了0.2234,区分度大小了,mysql选择了全表扫描。
我们来试试百分比为0.0338前缀为"wecp3"的执行计划

EXPLAIN
select id, shop_name, price, collects, shop_grade, address, longitude, latitude from t_food_shop  where geo_hash like 'wecp3%';

image-20200728120209011

可以看到使用到了idx_geohash索引

结论:字段值的重复率过高会导致索引失效

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值