我有以下查询
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)
使用覆盖索引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
有什么办法可以进一步优化这个查询吗?
Using index for group-by (scanning)
究竟是什么意思?这是否意味着整个GROUP BY
子句完全是从索引完成的,而语句的COUNT(DISTINCT ip_address)
部分不是?
答案 0 :(得分:3)
根据您提供的数据,我认为您无法进一步优化查询。
关于你的后续问题,MySQL的手册页描述Using index for group-by的解释输出说:
与使用索引表访问方法类似,使用index for group-by表示MySQL找到了一个索引,可用于检索GROUP BY或DISTINCT查询的所有列,而无需对实际表进行任何额外的磁盘访问。此外,索引以最有效的方式使用,因此对于每个组,只读取少数索引条目。有关详细信息,请参阅Section 8.13.10, “GROUP BY Optimization”。
您的索引特别适合加快查询速度。因为只选择了索引字段(查询中的每一列也出现在索引中),所以MySQL甚至可能根本不需要访问该表,因为所有相关数据都出现在索引中。
如果执行查询就像在google上执行搜索一样,想象一下不必点击任何链接的网站,因为您在搜索结果中直接找到了您要查找的信息 - 这就是喜欢什么不需要扫描表数据就像。以下是有关how MySQL uses indexes的更多信息:
在某些情况下,可以优化查询以在不咨询数据行的情况下检索值。 (为查询提供所有必要结果的索引称为covering index。)如果查询仅使用表中的数字列并且形成某个键的最左前缀,则可以检索所选值从索引树获得更快的速度:
SELECT key_part3 FROM tbl_name WHERE key_part1 = 1
答案 1 :(得分:0)
你可以在Objectify:
Objectify ofy = ObjectifyService.begin(); 查询query = ofy.query(这里是类name.class).filter(“表中的列名”,要查询的值).list();
在此之前,您可能需要为Objectify添加jar。