【发布时间】:2015-12-09 10:02:59
【问题描述】:
这是我的桌子:
create table page_relation (
relationid int primary key,
userid int,
pageid int,
registryid int
);
假设我想多次获取用户每个页面的所有注册表的计数。 这是我要经常运行的查询:
select count(*) as register_count
from page_relation
where userid = 10
group by pageid;
我需要帮助确定什么是加快查询速度的最佳索引。
到目前为止,我尝试在(userid, pageid) 上使用复合索引,希望 MySQL 将索引用于 group-by,但不幸的是,当我使用 EXPLAIN 时,额外的信息不包含任何“Using index for group-by”信息,只说我正在使用索引并且我正在使用 where。这是否意味着我的索引没有被用于排序?
如果这个索引是聚集的,理论上它不会工作吗?我在想一个 B-Tree、聚集和稀疏索引会很好地完成这项工作......老实说,我期待它甚至是一个覆盖索引,但我真的不知道它是否是。
这是我的解释声明:
# id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, page_relation, ref, idx_count, idx_count, 4, const, 60, Using where; Using index
仅用于执行此查询的最佳索引是什么?
感谢您的宝贵时间。
【问题讨论】:
-
很有趣,我也在某个地方遇到过,等待核心 DBA 的回答! BTW,一张表只能有1个聚集索引,而你的表聚集索引被主键占用。你也可以试试 FORCE 索引!
-
如果我删除主键索引怎么办?我做到了。
-
索引的强度取决于它的基数。 PK 的基数为 1。没有比这更好的了!
-
此索引
(userid, pageid)是一个覆盖索引,至于您的解释,没有使用索引进行分组。 dev.mysql.com/doc/refman/5.6/en/explain-output.html