MySQL是否使用了指数?

时间:2011-04-14 02:23:56

标签: mysql indexing aggregate-functions having

我的查询的一部分如下:

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

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

按原样查询,但顺便说一下。

我的另一个担忧是日期> '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

3 个答案:

答案 0 :(得分:1)

HAVING与GROUP BY一起使用,因此它是派生表。我不知道如何使用索引。

答案 1 :(得分:1)

例如:

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

计数由您的查询计算。它没有在您的情况下编入索引。您可以将having子句更改为where子句。

答案 2 :(得分:-1)

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

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

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

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

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