使用MySQL 查詢IN 子句中的多個欄位
處理結構化資料時,查詢IN 子句中的多個欄位是常見操作。然而,對於 MySQL 來說,對單一元組和一組元組使用 IN 子句之間存在細微的差異。
單元組查詢:
原始問題描述了一個場景,其中有四列(x0,y0,x1,y1)代表地理座標。對於單一值的組合,例如(4, 3, 5, 6),您可以使用IN 子句,如下所示:
SELECT * FROM my_table WHERE (x0, y0, x1, y1) IN ((4, 3, 5, 6))
在(x0, y0, x1, y1) 上使用複合索引),此查詢將有效地找到所需的行。
多元群組查詢:
但是,此問題也涉及查詢元組列表,例如[(4, 3, 5, 6), (9, 3, 2, 1)]。對於這種情況,MySQL 的最佳化器可能不會總是以最佳方式處理 IN 子句。
較新MySQL 版本中的最佳化器改進:
在早期MySQL 版本(5.7 之前)中,最佳化器會將多元群組查詢分解為一系列OR子句,如提供的中所述答案:
( ( x0 = 4 AND y0 = 3 AND x1 = 5 AND y1 = 6 ) OR ( x0 = 9 AND y0 = 3 AND x1 = 2 AND y1 = 1 ) )
這種方法可能會導致執行計劃效率低下,尤其是對於大型資料集。
在較新版本的 MySQL(5.7 及更高版本)中,優化器已得到改進,可以產生更多多個元組 IN 查詢的有效計劃。對於這些版本,建議使用以下語法:
(x0, y0, x1, y1) IN ((4, 3, 5, 6), (9, 3, 2, 1))
優化器將自動產生利用可用索引的最佳化執行計劃。
結論:
使用 MySQL 查詢 IN 子句中的多列時,建議的方法取決於 MySQL 版本。對於舊版本,建議將查詢分解為 OR 子句。對於較新的版本,改進的優化器可以有效處理多個元組 IN 查詢,而無需手動重組。
以上是如何使用MySQL的IN子句有效率地查詢多列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!