關於select where 的小技巧

2021-04-21 02:02:44 字數 2324 閱讀 7074

大家在寫sql 語句的時候, 如果是 select .. where 型別的語句, 有注意到條件的前後順序嗎?我今天做個小實驗。

比如查詢位址裡 包含「海口市」及「振興路」 兩個關鍵字的資料, 一般時候可能會用

select * from dm_addr where addr like '%海口市%' and addr like '%振興路%' 的形式,但其實這種查詢效率不高,原因在於條件的前後順序。以下是測試結果

mysql> select count(1) from dm_addr where addr like '%振興路%' and addr like '%海口市%';

+----------+

| count(1) |

+----------+

| 96 |

+----------+

1 row in set (0.82 sec)

mysql> select count(1) from dm_addr where addr like '%海口市%' and addr like '%振興路%';

+----------+

| count(1) |

+----------+

| 96 |

+----------+

1 row in set (0.91 sec)

我做了很多次查詢

where addr like '%海口市%' and addr like '%振興路%' 總是比 where addr like '%振興路%' and addr like '%海口市%'

慢,原因是查詢是先處理第一條件,然後在處理第二個條件,先查詢出所有 包含「海口市」的記錄,再在這些記錄中查詢包含"振興路" 的記錄。 對於位址情況, 包含「海口市」的記錄可能大於"振興路" 的記錄,我做測試的表有2萬條資料, 已經有大概0.1s的差別。如果碰到大資料,這個差別會更大。

按以上的分析結果, 我們寫sql語句的時候, 對於select ...where ... 型別的語句,應該把查詢結果範圍小的條件放在前面,查詢範圍大的條件放在後面,這樣會提高效率。

對於or的情況:

測試如下:

mysql> select count(1) from dm_addr where addr like '%海口市%' or addr like '%振興路%';

+----------+

| count(1) |

+----------+

| 39168 |

+----------+

1 row in set (0.84 sec)

mysql> select count(1) from dm_addr where addr like '%振興路%' or addr like '%海口市%';

+----------+

| count(1) |

+----------+

| 39168 |

+----------+

1 row in set (0.95 sec)

or語句的處理過程是這樣, 對於每一條位址, 逐個分析條件,如果符合第乙個條件,就不做第二條件的判斷,那麼我們應該把容易做判斷的條件放在前面, 比如查詢位址裡 包含「海口市」或「振興路」 個關鍵字的資料,按位址一般排法,xx市應該在xx路前。所以如果用第一種方式,那就效率高,判斷有海口市就可以確認這行位址有效了。 所以在寫or型別的條件時, 應該把容易判斷的條件寫在前面。

再做乙個not ... or .. not ... 測試,查詢不包含 海口市 或者不包含 振興路 的資料

mysql> select count(1) from dm_addr where addr not like '%海口市%' or addr not like '%振興路%';

+----------+

| count(1) |

+----------+

| 38752 |

+----------+

1 row in set (0.92 sec)

mysql> select count(1) from dm_addr where addr not like '%振興路%' or addr not like '%海口市%';

+----------+

| count(1) |

+----------+

| 38752 |

+----------+

1 row in set (0.86 sec)

因為每條資料都有海口市, 所以對於第乙個查詢,判斷第乙個條件都失敗了, 都需要判斷第二個。

對於第二個查詢, 只要判斷第乙個條件為真就可以確定這個記錄, 不需要判斷第乙個條件,

所以第二個查詢效率高過第乙個。

php的select where定位查詢

剛開始學php不久,對mysql的增刪檢查等語句還不是很了解,遇到了一些問題。在不斷的調整之後,終於搞懂了。mysqli new mysqli localhost root ip 資料庫使用者名稱 資料庫使用者密碼 資料庫名稱 if mysqli connect error 0 mysqli que...

關於position absolute的小用處

上圖插入了乙個小商標,這個正是用position absolute來寫的,極大的方便了商標的插入 下面就來介紹一下這個position absolute書寫這個的過程 在html中用span行級標籤去框這個小圖示,而不能用塊級標籤 我是圖示 在css中,需要把position abselute加入這...

關於CMap的小知識

最近在mfc中用到字典,自己不會在網上查了資料。簡單總結一下 一 cmap是什麼?對映 map 又稱為字典 dictionary 是由關鍵字 key 及其對應的元素值 value 所組成的元素單 元 element 的表單式集合。cmap是乙個mfc的模板類,可以建立乙個從任意型別的變數到另外乙個任...