簡體   English   中英

MySQL是否使用了指數?

[英]Does MySQL use indexes on 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

有幾行具有不同的日期值。 我想選擇日期>'2011-04-13 04:28:02'的ID組。 然后我想要一個屬於一個組的平均行數, 沒有日期條件

按原樣查詢,順便說一下也不行。

另一個問題是日期>'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

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

例如:

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

計數由您的查詢計算。 它沒有在您的情況下編入索引。 您可以將having子句更改為where子句。

該查詢沒有意義,因為列“date”在GROUP BY中,但既不是聚合也不是GROUP BY子句。

任何普通的SQL數據庫都會拒絕它; 如果在嚴格模式下,mysql會拒絕它。

在這種情況下,行為基本上是未定義的。 不要這樣做。

我很確定你想要WHERE過濾你的行,而不是HAVING。 而且您不希望在列列表中指定日期,請嘗試使用min(date)或max(date)。

不,HAVING不會使用索引,因為它需要執行GROUP BY來查找HAVING匹配的組。 通常情況下,最好使用WHERE,並且只在聚合上使用HAVING(例如,HAVING COUNT(*)> 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM