MySql的IN和OR的效率問題

2021-10-08 21:59:30 字數 646 閱讀 4414

**mysql in 和 or 效率問題

假設檢索的列為n,in 的時間複雜度為 o(logn),而 or 的時間複雜度為 o(n)

在資料量少於100條時的情況下差別不大

當要檢索的列為主鍵索引時,in 的執行速度和 or 差別不大

當要檢索的列為普通索引時,in 的執行速度和 or 差別不大

當要檢索的列沒有索引時,in的執行速度要遠大於 or

例如:1000條左右的資料,沒有索引的情況下執行時間 in 是在秒級別,而or是分鐘級別的。

對於下面這條 sql 語句:

select * from tbname where key in (a1, a2, … , an);

select * from tbname where key = a1 or key = a2 or … or key = an;

用不上索引的情況下,遍歷全表的 key,去匹配 a1, a2, …, an

or,就是從 a1 匹配,匹配失敗,去匹配 a2,直到匹配成功或者乙個都匹配不上,時間複雜度是 o(n)

in,先將 a1, a2, …, an 變成二叉搜尋樹,用過二叉樹查詢,時間複雜度為o(logn)

因此,in 的效率要高於 or,引數集合範圍越大,in 的效能不會太大下降,而 or 會下降非常厲害。

mysql中or和in的效率問題

分三中情況進行測試,分別是 第一種情況 in和or所在列為主鍵的情形。第二種情況 in和or所在列建立有索引的情形。第二種情況 in和or所在列沒有索引的情形。每種情況又採用不同的in和or的數量進行測試。由於測試語句的資料量有4種情況,我這裡就稱為a組 b組 c組 d組,其中a組為3個值,b組為1...

Linq中Count 和Any 引發的效率問題

1 count和any 今天看了0 來判斷集合非空 href target blank 鶴沖天的文章 linq 切勿使用 count 0 來判斷集合非空 有所收穫,寫下文章總結一下 先看如下 1 static void main string args 212 public static ienum...

你擔心handlerThread的效率問題嗎?

handlerthread handler looper messagequeue相互關聯對應 queue是通過msg.next指向下乙個msg來實現,mmessages代表當前的message,每取出乙個msg,移動一次mmessages,一直到最後乙個msg handlerthread是乙個執行...