MySQL-mysql 按照索引分组查询为什么使用不上索引?

WP主题讨论 WP主题讨论 主题:1013 回复:2239

MySQL-mysql 按照索引分组查询为什么使用不上索引?

泛泛之交 发布于 2017-05-01 字数 235 浏览 1355 回复 3

表结构:

Create Table: CREATE TABLE `tab` (
`id` int(10) NOT NULL auto_increment,
`type` char(16) NOT NULL,
PRIMARY KEY (`id`),
KEY `t` (`type`)
) ENGINE=MyISAM

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

灵芸 2017-10-23 3 楼

在做mysql 数据优化的时候讲到GROUP BY的优化,下面是GROUP BY 没用索引的情况。

对不同的索引键做 GROUP BY
在非连续的索引键部分上做 GROUP BY
用于搜索记录的索引键和做 GROUP BY 的不是同一个

还有一种情况,也是我们经常犯错误的应用:查询字段必须和后面GROUP BY 一致这样才能用到索引,正如你上面sql!

清晨说ぺ晚安 2017-10-21 2 楼

去掉id字段就可以了 查询字段必须和group by 保持一致
group by 使用索引有两种情况:
1、使用松散索引实现,即mysql完全使用索引扫描实现group by操作,更直接的说,就是sql语句中所有的字段都在同一个索引中,需要满足一下几个条件:
group by的条件字段必须在同一个索引中最前面的连续位置;
使用group by的同时,只能使用max和min连个聚合函数(B+);
如果引用到该索引中group by条件之外的字段的时候,必须以常量的形式存在;
2、使用紧凑索引扫描实现,即读取所有满足条件的索引键,然后再根据读取后的数据来完成 GROUP BY 操作得到相应结果。

归属感 2017-08-25 1 楼

你的问题是对GROUP BY索引的应用不清楚,下面是以前总结的东西,希望对你有帮助
一、GROUP BY 的索引应用
1、查询字段必须和后面GROUP BY 一致
select TeamID from competeinfo where TeamID >10 group by TeamID。
这里就是通过TeamID 来查找。完成group by 。
2、联合索引的应用,切记注意GROUP BY 顺序,Where 条件和GROUP BY 字段得是一个索引里面的
这个表CompeteID,TeamID建立联合索引
1)select TeamID from competeinfo where TeamID >10 and CompeteID > 100020 group by CompeteID
这个查询用到了CompeteID,TeamID联合索引
2)select TeamID from competeinfo where TeamID >10 and CompeteID > 100020 group by TeamID
这样的话查询group by中就没有用到索引了
二、下面是总结的是联合索引的使用
Index(Name,Age)表示在Name,Age两列上建立联合索引
如果where name='pp' 能使用索引
where age=25时不能使用索引
where name='pp' and age>25 能使用索引
where name ='pp' order by age 能使用索引
where name>'pp' order by age 不能使用索引
where name>'pp' order by name,age 能使用索引
order by name asc age desc 将不能使用索引!