簡體   English   中英

MYSQL (field1, field2) = (x,y) vs field1= x AND field2 = Y 之間的差異

[英]MYSQL Difference between ( field1, field2 ) = (x,y) vs field1= x AND field2 = Y

我有一個包含以下字段的表 studentDB

select sid, sname, sDOB from Student

我見過很多地方, (xx,yy)AND之間有什么區別,哪一個在性能方面更好

select * from Student where (sid,sname) = (101,'foo')

對比

select * from Student where sid = 101 AND sname = 'foo'

並且在用於匹配時這個運算符()的名稱是什么?

(sid,sname)被稱為“元組”,一些數據庫引擎在不同程度上支持它們。 MySQL 8 做得很好。

現在,使用相等時,這兩個表達式之間沒有區別。 但是,元組對於不等式可能非常有用。 例如:

select * from t where (a, b) <= (1, 0)

不同於:

select * from t where a <= 1 and b <= 0

當使用元組時,元素的比較是按順序進行的,一個接一個。 請參閱DB Fiddle的差異示例。

行構造函數比較在 SQL 語法中是合法的,但在 MySQL 5.5 及更早版本中,此語法不支持索引優化,因此不鼓勵使用。

請參閱https://dev.mysql.com/doc/refman/8.0/en/row-constructor-optimization.html

到目前為止,所有受支持的 MySQL 版本都支持行構造函數比較的索引優化。 缺少此功能的舊版本已經過時,因此無論如何您都不應該使用這些舊版本。 因此,沒有理由再避免這種語法了。

2013-12-03 MySQL 5.7.3 更新日志:

優化器現在能夠將范圍掃描訪問方法應用於這種形式的查詢:

SELECT... FROM t1 WHERE ( col_1, col_2 ) IN (( 'a', 'b' ), ( 'c', 'd' )); 以前,要使用范圍掃描,查詢必須寫為:

SELECT... FROM t1 WHERE ( col_1 = 'a' AND col_2 = 'b' ) OR ( col_1 = 'c' AND col_2 = 'd' ); 為了讓優化器使用范圍掃描,查詢必須滿足以下條件:

只能使用IN謂詞,不能使用NOT IN

IN 謂詞左側的行構造函數中可能只有列引用。

IN 謂詞的右側必須有多個行構造函數。

IN 謂詞右側的行構造函數必須僅包含運行時常量,它們是在執行期間綁定到常量的文字或本地列引用。

EXPLAIN output 適用的查詢將從全表或索引掃描更改為范圍掃描。 通過檢查Handler_read_firstHandler_read_keyHandler_read_next狀態變量的值也可以看到更改。

(我不知道 MariaDB 是否進行了優化。)

暫無
暫無

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

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