![](/img/trans.png)
[英]Difference between MATCH (field1, field2) and MATCH(field1) OR MATCH(field2)
[英]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_first 、 Handler_read_key和Handler_read_next狀態變量的值也可以看到更改。
(我不知道 MariaDB 是否進行了優化。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.