use*_*637 7 mysql query-optimization
我有以下查询
EXPLAIN SELECT COUNT(DISTINCT ip_address) as ip_address, exec_date
FROM requests
GROUP BY exec_date;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE requests range NULL daily_ips 263 NULL 488213 Using index for group-by (scanning)
Run Code Online (Sandbox Code Playgroud)
有覆盖指数 daily_ips
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
requests 1 daily_ips 1 exec_date A 16 NULL NULL YES BTREE
requests 1 daily_ips 2 ip_address A 483492 NULL NULL YES BTREE
Run Code Online (Sandbox Code Playgroud)
有什么办法可以进一步优化这个查询吗?
究竟是什么Using index for group-by (scanning)意思?是否意味着整个GROUP BY子句完全是从索引完成的,而COUNT(DISTINCT ip_address)语句的一部分不是?
根据您提供的数据,我看不到任何可以进一步优化查询的方法。
\n至于你的后续问题,MySQL 的手册页描述了使用索引进行分组的解释输出说:
\n\n\n与使用索引表访问方法类似,使用索引进行分组表示 MySQL 找到了一个可用于检索 GROUP BY 或 DISTINCT 查询的所有列的索引,而无需对实际表进行任何额外的磁盘访问。此外,索引以最有效的方式使用,因此对于每个组,仅读取几个索引条目。有关详细信息,请参阅第 8.13.10 节 \xe2\x80\x9cGROUP BY Optimization\xe2\x80\x9d。
\n
您的索引特别适合加快查询速度。因为只选择索引字段(查询中的每一列也出现在索引中),MySQL 甚至可能根本不需要访问表,因为所有相关数据都出现在索引中。
\n如果执行查询就像在google上执行搜索一样,想象一下不必单击任何链接的站点,因为您直接在搜索结果中找到了您要查找的信息 - 这有点像不需要的信息扫描表数据就好了。以下是有关MySQL 如何使用索引的更多信息:
\n\n\n在某些情况下,可以优化查询以检索值,而无需查阅数据行。(为查询提供所有必要结果的索引称为覆盖索引。)如果查询仅使用表中的数字列并且构成某个键的最左边前缀,则可以从索引中检索选定的值树以获得更快的速度:
\n从tbl_name中选择key_part3, 其中key_part1 =1
\n
| 归档时间: |
|
| 查看次数: |
964 次 |
| 最近记录: |