2011-04-14 28 views
4

我查询一部分是这样的:MySQL是否在使用索引?

HAVING date > '2011-04-13 04:28:03' 

日期变量被索引,这是否对查询有什么影响?

EXPLAIN EXTENDED似乎并没有使用索引,但我不知道这是否仅仅是因为我在测试数据库中有4行。

我的查询:

SELECT AVG(slen) FROM 
(
SELECT date, COUNT(id) as slen 
FROM table 
WHERE product_id = 2830 
GROUP BY id 
HAVING date > '2011-04-13 04:28:02' 
) as T 

。它有不同的日期值的几行。我想选择日期>'2011-04-13 04:28:02'的ID组。然后我需要属于一个组的行的平均数量,没有日期条件

原样查询,仍然无法正常工作。

我的其他问题是date>'2011-04-13 04:28:02'是否会使用我的日期列索引。

从这个数据集:

sid    datelast    product_id 
782240551706 2011-04-13 00:51:52  2830 
782240551706 2011-04-13 04:05:48  2830 
782240551706 2011-04-13 04:28:03  2830 
111111111111 2011-04-13 00:50:30  2830 

所需的结果:

ID为782240551706该组应该选择,平均应为3

以下查询生成所需的结果:

SELECT AVG(slen) FROM 
(
SELECT date, COUNT(id) as slen 
FROM table 
WHERE product_id = 2830 
GROUP BY id 
HAVING **max(date)** > '2011-04-13 04:28:02' 
) as T 
+0

任何使用HAVING而不是WHERE的理由? – zerkms 2011-04-14 02:42:37

+0

你能告诉我们一个你期望得到结果的样本吗? – dkretz 2011-04-14 02:51:51

+0

添加了预期结果。 – Tony 2011-04-14 02:59:03

回答

1

HAVING与GROUP BY结合使用,所以我t是派生表。我不知道如何使用索引。

+0

这是否意味着如果我想检查每个组是否处于某个日期范围内,那么它将不得不扫描每一行来限定HAVING条件? – Tony 2011-04-14 02:31:09

+0

我认为如果您可以发布更多关于您正在尝试做的事情的信息,会更容易。我想你想在GROUP BY子句之前使用日期条件。 – 2011-04-14 02:33:10

+0

再次编辑原文。 – Tony 2011-04-14 02:44:05

1

例如:

SELECT 
    column1, 
    count(column2) as count 
FROM table 
GROUP BY column1 
HAVING count > 1 

计数由您的查询计算。这不是你的情况索引。您可以将having子句更改为where子句。

-1

该查询没有意义,因为“date”列位于GROUP BY中,但既不是聚合也不是GROUP BY子句。

任何正常的SQL数据库都会拒绝它;如果在严格模式下,mysql会拒绝它。

在这种情况下,行为基本上是不确定的。不要这样做。

我很确定你想要在哪里过滤你的行,而不是HAVING。而且您不想在列列表中指定日期,请尝试min(日期)或max(日期)。

而且不,HAVING不会使用索引,因为它需要执行GROUP BY来查找HAVING匹配的组。通常情况下最好使用WHERE,而你只能在聚合上使用HAVING(例如HAVING COUNT(*)> 1)