MySQL使用IN代替OR的原因
對於許多資料庫伺服器而言,IN()列表不過是多個OR語句的同義詞而已,因為IN和OR在邏輯上是等同的。不僅是在MySQL資料庫伺服器,對於許多其他的資料庫伺服器使用到IN查詢時,都是按照如下方式處理的:
[1] 對IN列表中的數值進行排序。
[2] 對於查詢的匹配,每次使用二分查詢去匹配IN列表的數值。
所以對於第[2]步,每次比較的演算法複雜度大概為O(log n)。相反,對於同樣邏輯的OR列表,每次都要遍歷,所以OR相應的演算法複雜度為O(n)(因此對於遍歷非常大的OR列表,會很緩慢!)。
因此,在瞭解了IN和OR的區別之後,每次優化,我們可以採用如下方式:
1.儘量將能使用IN來代替OR查詢。
2.對IN列表中的資料,寫SQL的時候排好序,避免MySQL來做這個工作。
相關推薦
MySQL使用IN代替OR的原因
對於許多資料庫伺服器而言,IN()列表不過是多個OR語句的同義詞而已,因為IN和OR在邏輯上是等同的。不僅是在MySQL資料庫伺服器,對於許多其他的資料庫伺服器使用到IN查詢時,都是按照如下方式處理的: [1] 對IN列表中的數值進行排序。 [2] 對於查詢的匹配,每次使用二分查詢去匹配IN列表的數
使用UNION代替OR 提升查詢效能
昨天一位鐵哥們通過QQ找我幫忙,問下面這個SQL能否優化 SQL> set timing on SQL> set autotrace on SQL> select count(*) rowcount_lhy 2 from swgl_ddjbxx
MYSQL索引的使用(使用UNION ALL代替OR)
一個文章庫,裡面有兩個表:category和article。category裡面有10條分類資料。article裡面有20萬條。article裡面有一個"article_category"欄位是與category裡的"category_id"欄位相對應的。article表裡
FCN用卷積層代替FC層原因(轉)
alex spa 內容 pool 計算 lex 級別 conv2 本質 分類任務 CNN對於常見的分類任務,基本是一個魯棒且有效的方法。例如,做物體分類的話,入門級別的做法就是利用caffe提供的alexnet的模型,然後把輸出的全連接層稍稍修改稱為自己想要的類別數,然後再
centos systemctl daemon-reload 提示 no such file or directory 的一個原因
emc systemctl system directory srvice 成了 UC service srv service 的文件名寫錯了 比如 mongodb.service 寫成了 mongodb.srvice 真的是坑,居然沒有提示具體的路徑,只是提示一
Row was updated or deleted by another transaction 異常原因及處理(樂觀鎖)
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.xx.xx:11]
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) 異常原因及處理
主因 : 事務對程式的影響 原因一: 查詢出來的物件和update的物件不是同一個 解決: 用查詢出的物件進行set 值, 再用同一個物件update 原因二: 查詢出來的物件在快取中一段時間 , 之後再進行的update 解決: 把這個物件從快取中剔除(如需要物件屬性可
[25]stop方法被拋棄的原因和代替方法
在JAVA API中寫著: stop()方法無論執行緒在什麼狀態下,所代表的執行緒都將被強制停止。 class ThreadStop implements Runnable{ private int num; @override public void run()
使用BN時ValueError: expected 2D or 3D input (got 4D input)的可能原因
可能原因在於應該使用 BatchNorm2d 而你使用了 BatchNorm1d 如果是BatchNorm1d的話,input的形狀應該是: Input: :math:`(N, C)` or :math:`(N, C, L)` 如果是BatchNorm2d的話,i
一個小坑: -bash: ./backup.sh: /bin/bash^M: bad interpreter: No such file or directory 由於shell指令碼檔案被我在Windows下編輯過,出現上面錯誤的原因之一是指令碼檔案是DOS格式的, 即每一行的行尾以\r\n來標識
由於shell指令碼檔案被我在Windows下編輯過,出現上面錯誤的原因之一是指令碼檔案是DOS格式的, 即每一行的行尾以\r\n來標識, 使用vim編輯器開啟指令碼, 執行::set ff? 可以看到DOS或UNIX的字樣. 使用se
-bash: ls: No such file or directory 產生的原因及修改方法
ubuntu出現如下錯誤: { Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.15.0-42-generic x86_64) * Documentation: https://help.ubuntu.com * Managemen
VS2013使用scanf、gets及字串函式編譯報錯error C4996: 'scanf': This function or variable may be unsafe. 原因及解決方案
VS2013使用scanf、gets及字串函式編譯報錯error C4996: ‘scanf’: This function or variable may be unsafe. 原因及解決方案 問題原因: C語言的標準函式中,一些讀取或寫入記憶體的函式存在記憶
ValueError: Input contains NaN, infinity or a value too large for dtype('float32'64)可能的原因
造成這個錯誤的原因有一下三個: 1:既有可能出現的問題,nan,例如分母為0,或是log(-1)這種明顯違背數學常理的情況 2:無窮值,無窮大或無窮小,例如log(0)就是一個負無窮的數值,無法處理 3:數值超出了float能表達的範圍,以至於無法使用float表達出來
啟動docker容器提示"docker: Error response from daemon: Container command not found or does not exist"的原因
docker容器匯入匯出有兩種方法: 一種是使用save和load命令使用例子如下: docker save ubuntu:load>/root/ubuntu.tar docker load<ubuntu.tar 一種是使用export和import命令使用
sftp登入linux Received message too long (or "Bad packet length") 原因,已解決
sftp and scp2 both actually work by running sshin a subprocess, to connect to the remote host and run the file-transferserver (usually na
Linux環境下mount提示Already mounted or busy 原因查詢
在Ubuntu的環境下,發現有個磁碟沒有利用起來,就打算將此磁碟利用起來,存放備份日誌使用。結果在使用過程中遇到一下問題,記錄如下: 1)使用lsblk命令檢視到有個sda的磁碟沒有使用。然後使用fdisk命令打算將其分割槽。但是使用fdisk /dev/sd
使用NVL代替IS NULL OR IS NOT NULL,提高查詢效率
最近工作的時候遇到了比較大的資料查詢,自己的sql在資料量小的時候沒問題,在資料量達到300W的時候特別慢,只有自己優化sql了,以前沒有優化過,所以記錄下來自己的優化過程,本次是關於is null和is not null的優化。所用環境0racle11g (adsbygoogle
關於shell指令碼提示No such file or directory的解決辦法和原因
在執行剛編寫完的shell指令碼時,報錯現象:解決辦法: vim模式開啟這個shell指令碼,檢視編碼格式後設置成unix編碼 具體操作: vim shellarr.sh開啟指令碼,ctrl+c進入輸入:命令的格式,輸入:set ff?,檢視格
MySQL SQLSTATE[42000]: Syntax error or access violation: 1286 Unknown table engine 'InnoDB' 錯誤的原因及解決
我的一個網站用ThinkPHP搭建的,今天網站掛了,開啟除錯模式看了一下,錯誤資訊如下 SQLSTATE[42000]: Syntax error or access violation: 1286 Unknown table engine 'InnoDB' 看起來是In
AngularJs裡給圖片賦值需要用ng-src來代替src的原因
我們同樣為每條記錄新增手機圖片,只需要使用ngSrc指令代替的src屬性標籤就可以了。如果我們僅僅用一個正常src屬性來進行繫結,瀏覽器會把AngularJS的{{ 表示式 }}標記直接進行字面解釋,並且發起一個向非法