[英]MySQL GROUP BY with Using Temporary unnecessarily?
我正在尝试优化查询。 使用EXPLAIN
告诉我它是Using temporary
。 考虑到表的大小(20m +条记录),这确实效率很低。 在查看MySQL文档的内部临时表时,我看不到任何暗示查询中需要临时表的内容。 我还尝试将ORDER BY设置为与GROUP BY相同,但仍然说“使用临时”,并且查询需要永远运行。 我正在使用MySQL 5.7。
有没有一种方法可以避免对此查询使用临时表:
SELECT url,count(*) as sum
FROM `digital_pageviews` as `dp`
WHERE `publisher_uuid` = '8b83120e-3e19-4c34-8556-7b710bd7b812'
GROUP BY url
ORDER BY NULL;
这是我的表架构:
create table digital_pageviews
(
id int unsigned auto_increment
primary key,
visitor_uuid char(36) null,
publisher_uuid char(36) default '' not null,
property_uuid char(36) null,
ip_address char(15) not null,
referrer text null,
url_delete text null,
url varchar(255) null,
url_tmp varchar(255) null,
meta text null,
date_created timestamp not null,
date_updated timestamp null
)
collate = utf8_unicode_ci;
create index digital_pageviews_url_index
on digital_pageviews (url);
create index ndx_date_created
on digital_pageviews (date_created);
create index ndx_property_uuid
on digital_pageviews (property_uuid);
create index ndx_publisher_uuid
on digital_pageviews (publisher_uuid);
create index ndx_visitor_uuid_page
on digital_pageviews (visitor_uuid);
之所以需要一个临时表,是因为它既不能按publisher_uuid
进行过滤,也不能对没有索引的列进行排序。 第一步是按publisher_uuid
进行过滤,因此它将使用publisher_uuid
上的索引。
但是,接下来它必须对记录进行分组和排序,这将需要一个临时表,因为它不能使用执行此操作的索引。 之所以不能使用索引,是因为它已经使用了publisher_uuid
,但未在url
字段上建立索引,因此无法对您依据的字段进行分组。
要过滤哪里publisher_uuid = '8b83120e-3e19-4c34-8556-7b710bd7b812'
,按url
分组和按url
排序,请按以下顺序创建包含这些字段的索引:
create index ndx_publisher_uuid
on digital_pageviews (publisher_uuid, url);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.