7

我有以下查询

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)语句的一部分不是?

4

2 回答 2

3

根据您提供的数据,我看不出有任何方法可以进一步优化查询。

至于您的后续问题,MySQL 的手册页描述了Using index for group-by 的解释输出说:

与 Using index table access 方法类似, Using index for group-by 表示 MySQL 找到了一个索引,该索引可用于检索 GROUP BY 或 DISTINCT 查询的所有列,而无需对实际表进行任何额外的磁盘访问。此外,索引以最有效的方式使用,因此对于每个组,只读取几个索引条目。有关详细信息,请参阅第 8.13.10 节,“GROUP BY 优化”</a>。

您的索引特别适合加快查询速度。因为只选择了索引字段(查询中的每一列也出现在索引中),MySQL 甚至可能根本不需要命中表,因为所有相关数据都出现在索引中。

如果执行查询就像在google上执行搜索一样,想象一下不必点击任何链接的网站,因为您直接在搜索结果中找到了您正在寻找的信息 - 这有点像不需要扫描表数据之类的。以下是有关MySQL 如何使用索引的更多信息:

在某些情况下,可以优化查询以在不查阅数据行的情况下检索值。(为查询提供所有必要结果的索引称为覆盖索引。)如果查询仅使用表中的数字列并且形成某个键的最左前缀,则可以从索引中检索所选值树以获得更快的速度:

tbl_name WHERE key_part1 中选择key_part3 1

于 2012-11-27T18:29:55.297 回答
0

你可以 Objectify :

Objectify ofy = ObjectifyService.begin(); Query query = ofy.query(这里是类名.class).filter("表中的列名",要查询的值).list();

在此之前,您可能需要为 Objectify 添加 jar。

于 2012-11-28T03:06:49.050 回答