我想查找在約500米的行表中有後續的所有小時記錄。JOIN和IN之間的MySQL性能差異
我嘗試:
SELECT DISTINCT (date_time)
FROM my_table
JOIN (SELECT DISTINCT (DATE_ADD(date_time, INTERVAL 1 HOUR)) date_offset
FROM my_table) offset_dates
ON date_time = date_offset
和
SELECT DISTINCT(date_time)
FROM my_table
WHERE date_time IN (SELECT DISTINCT(DATE_ADD(date_time, INTERVAL 1 HOUR))
FROM my_table)
在幾秒鐘的第一個完成,秒掛起小時。 我可以理解,越早越好,但爲什麼這麼巨大的性能差距?
--------編輯---------------
這裏是EXPLAIN
對於兩個詢問
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 1710 Using temporary
1 PRIMARY my_table ref PRIMARY PRIMARY 8 offset_dates.date_offset 555 Using index
2 DERIVED my_table index NULL PRIMARY 13 NULL 5644204 Using index; Using temporary
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY my_table range NULL PRIMARY 8 NULL 9244 Using where; Using index for group-by
2 DEPENDENT SUBQUERY my_table index NULL PRIMARY 13 NULL 5129983 Using where; Using index; Using temporary
我可能是錯的,但它是非常重的子查詢。所以如果你用'JOIN'和'ON'子句執行它,速度會更快,因爲它不會檢索子選擇的每個結果。在第二個查詢中,您首先檢索子查詢的所有結果,然後查看它。 – Brewal