请教Mysql关于表字段如何创建索引。

老头草帽 2019-02-01 05:22:33
需要执行的语句如下:

select a,min(b) b,c from table group by a,c having count(*) >1


现在执行,遍历整个数据库效率极低。该创建哪个字段的索引才可以高效执行?
...全文
406 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
西红柿ki 2019-02-12
  • 打赏
  • 举报
回复
你表数据量有多大呀? 满足条件的有多少?如果大部分都满足,肯定是全表扫描了
我测试了下,15条数据只有1条满足,加ac复合索引是可以的
或者你查询的时候加强制索引
select a,min(b) b,c from table force index(索引名) group by a,c having count(*) >1

老头草帽 2019-02-02
  • 打赏
  • 举报
回复
引用 6 楼 健康的猴子 的回复:
select a,(select min(b) from table where a =table0.a and c=table0.c ) b,c from ( SELECT a,c FROM table group by a,c ) table0 group by a,c ;
这样试试看

大神,你测试过吗,运行这个语句会直接cpu满负荷,其他操作全都卡顿。
健康的猴子 2019-02-01
  • 打赏
  • 举报
回复
select tabel1.a,min(tabel2.b),tabel1.c from (select a,c from table group by a,c) tabel1 left join (select a,b,c from table) tabel2 on tabel1.a=tabel2.a and tabel1.c=tabel2.c group by tabel1.a, tabel1.c ; 可能跟上面会是一样的
健康的猴子 2019-02-01
  • 打赏
  • 举报
回复
select a,(select min(b) from table where a =table0.a and c=table0.c ) b,c from ( SELECT a,c FROM table group by a,c ) table0 group by a,c ; 这样试试看
老头草帽 2019-02-01
  • 打赏
  • 举报
回复

上传的图为什么不显示呢。
老头草帽 2019-02-01
  • 打赏
  • 举报
回复
引用 2 楼 健康的猴子 的回复:
select a,min(b) b,count(b) coub,c from table group by a,c having coub >1
不晓得有无快些,还是一样


按你的思路,EXPLAIN测试执行该语句时索引生效。但依然遍历全表。
老头草帽 2019-02-01
  • 打赏
  • 举报
回复
尝试3:
select a,min(b) b,c from table group by a,c 

删除count(*)后,EXPLAIN测试执行该语句时索引生效。但依然遍历全表。
健康的猴子 2019-02-01
  • 打赏
  • 举报
回复
select a,min(b) b,count(b) coub,c from table group by a,c having coub >1 不晓得有无快些,还是一样
老头草帽 2019-02-01
  • 打赏
  • 举报
回复
是遍历了整个table表。。。。

尝试1:建立a c字段的组合索引
alter table table add index (a,c);

索引建立完毕后,EXPLAIN测试执行该语句时索引未生效。

尝试2:建立a b c字段的组合索引
alter table table add index (a,b,c);

索引建立完毕后,EXPLAIN测试执行该语句时索引生效。但依然遍历全表。

是否因为食用了 count(*) 才导致的全表搜索呢?

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧