[英]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.