mysql聯合索引與Where子句優化淺析

問題描述:
把排序、條件等一個一個去除來做測試,結果發現問題就出在排序部分,去除排序時,執行時間由原來的48秒變成0.3x秒。
于是,把涉及排序的字段組成一個聯合索引alter table xx add index indexname(x1,x2,x3),經過2分鐘創建新索引之后,再執行同一個SQL語句,執行時間變成了0.28S。
?
例如,需要
where col1=??? and col2=???
則建議創建索引: (col1,col2)

如果需要 where col1=?? order by col3
則建議創建索引: (col1,col3)

按照同樣的思路把其它幾個常用的SQL作了過些優化,效果很明顯的說。
過了30分鐘再查slow sql記錄文件,卻發現原來一個好好的SQL變得灰常慢了,為何?

原因分析:
因為添加了聯合索引的原因,而且這個SQL語句當中有個or,當把這個or改用union之后問題排除。

附,一段關于Where子句的執行順序:

在用MySQL查詢數據庫的時候,連接了很多個用,發現非常慢。

例如:
?

復制代碼代碼示例:
SELECT ... WHERE p.languages_id = 1 AND m.languages_id = 1 AND c.languages_id = 1 AND t.languages_id = 1 AND p.products_id IN (472,474)??
?

?這樣查詢需要20多秒,雖然在各個字段上都建立了索引。用分析Explain SQL一分析,發現在第一次分析過程中就返回了幾萬條數據:
WHERE p.languages_id = 1 ,然后再依次根據條件,縮小范圍。

改變一下WHERE 字段的位置之后,速度就有了明顯地提高:
WHERE p.products_id IN (472,474) AND p.languages_id = 1 AND m.languages_id = 1 AND c.languages_id = 1 AND t.languages_id = 1??
這樣,第一次的條件是p.products_id IN (472,474),它返回的結果只有不到10條,接下來還要根據其它的條件來過濾,自然在速度上有了較大的提升。

實踐小結:
不要以為WHERE中的字段順序無所謂,應該盡可能地第一次就過濾掉大部分無用的數據,只返回最小范圍的數據。

轉載于:https://www.cnblogs.com/liuzhuqing/p/7363862.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371496.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

有效使用Eclipse的熱門提示

以下是一些技巧,可以幫助您避免潛在的問題并在使用Eclipse時提高工作效率。 避免安裝問題 切勿在舊版本之上安裝新版本的Eclipse。 首先重命名舊版本,將其移開,然后將新版本解壓縮到干凈的目錄中。 恢復混亂的工作空間 對于許多開發人員來…

android拍照截圖組件,Android截圖命令screencap與視頻錄制命令screenrecord(示例代碼)...

查看幫助命令[email protected] ~$ adb shell screencap -vscreencap: invalid option -- vusage: screencap [-hp] [-d display-id] [FILENAME]-h: this message-p: save the file as a png.-d: specify the display id to capture, default 0.If FILENAME ends with .png it …

usaco 2017 February platinum

1.一條路,兩邊都是一個1到n的全排列,可以把其中一個全排列的起始位置改變(比如123可以變成231或者312) 然后把相同的數連起來,求小交叉數。 先算一下交叉數,然后直接一步步移動,O1更新一下狀態就…

Hessian 源碼簡單分析

Hessian 源碼簡單分析 Hessian 是一個rpc框架, 我們需要先寫一個服務端, 然后在客戶端遠程的調用它即可。 服務端: 服務端通常和spring 做集成。 首先寫一個接口: public interface HelloService { void sayHello(String n…

Java開發人員應該知道的三件事

對于那些長期關注JavaOne 2012會議的讀者來說,這是一篇有趣的文章。 我最近對Java冠軍Heinz Kabutz的采訪引起了我的注意; 包括他的Java內存難題程序,從Java內存管理的角度來看,這很有啟發性。 采訪中有一個特別的部分吸引了我的注…

android怎么垂直居中且靠右,placeholder 靠右垂直居中/位置兼容

1.input輸入框文字靠右垂直居中。2.placehoder提示同樣靠右垂直居中。( placeholder是HTML5 input的新屬性,英文意思是占位符,它一般表示input輸入框的默認提示值。)css代碼input {text-align: right;font-size:0.3rem;width:100%;height:0.78rem;line-…

Python-Matplotlib 18 注釋

Python-Matplotlib 18 注釋 EG1: import numpy as np import matplotlib.pyplot as plty np.arange(-5, 6,1) plt.plot(y, y*y) plt.annotate(Annotate , xy(0,1) , xytext(0,5) ,arrowpropsdict(facecolorr , frac0.2 ))plt.show()轉載于:https://www.cnblogs.com/zsr0401/p/…

while和for循環

循環結構圖: 循環結構主要分為兩種:有while和for兩種循環,while又分為do{...}while和while{...},do...while表示先執行后判斷,而while循壞表示先判斷后執行,如果循環條件都不滿足的情況下,do...while至少執…

通過beforeClass和afterClass設置增強Spring Test Framework

如何允許實例方法作為JUnit BeforeClass行為運行 JUnit允許您在所有測試方法調用之前和之后一次在類級別上設置方法。 但是,通過有意設計,他們將其限制為僅使用BeforeClass和AfterClass批注的靜態方法。 例如,此簡單的演示顯示了典型的Junit設…

華為鴻蒙出來正當時,關于華為鴻蒙操作系統,中興率先表態

原標題:關于華為鴻蒙操作系統,中興率先表態 來源:科技數碼迷進入2021年之后中興這個品牌的存在感越來越強了,并且還學會了借勢營銷。每當國內智能手機領域有大事之時總會看到中興或紅魔手機的身影。這說明在5G過渡期中興要借個機會…

條件變量(Condition Variable)詳解

轉載于:http://blog.csdn.net/erickhuang1989/article/details/8754357 條件變量(Condtion Variable)是在多線程程序中用來實現“等待->喚醒”邏輯常用的方法。舉個簡單的例子,應用程序A中包含兩個線程t1和t2。t1需要在bool變量test_cond為true時才能…

C++中的深拷貝和淺拷貝 QT中的深拷貝,淺拷貝和隱式共享

下面是C中定義的深,淺拷貝 當用一個已初始化過了的自定義類類型對象去初始化另一個新構造的對象的時候,拷貝構造函數就會被自動調用。也就是說,當類的對象需要拷貝時,拷貝構造函數將會被調用。以下情況都會調用拷貝構造函數&#…

使用PowerMock模擬構造函數

我認為,依賴項注入的主要好處之一是可以將模擬和/或存根對象注入代碼中,以提高可測試性,增加測試覆蓋率并編寫更好,更有意義的測試。 但是,有時候您會遇到一些不使用依賴注入的傳統代碼,而是通過組合而不是…

Brackets (區間DP)

個人心得:今天就做了這些區間DP,這一題開始想用最長子序列那些套路的,后面發現不滿足無后效性的問題,即(,)的配對 對結果有一定的影響,后面想著就用上一題的思想就慢慢的從小一步一步…

android生成aar無效,android studio生成aar包并在其他工程引用aar包的方法

1.aar包是android studio下打包android工程中src、res、lib后生成的aar文件,aar包導入其他android studio 工程后,其他工程可以方便引用源碼和資源文件2.生成aar包步驟:①.用android studio打開一個工程,然后新建一個Module&#…

《劍指offer》— JavaScript(3)從尾到頭打印鏈表

從尾到頭打印鏈表 題目描述 輸入一個鏈表,從尾到頭打印鏈表每個節點的值。 實現代碼 /*function ListNode(x){this.val x;this.next null; }*/ function printListFromTailToHead(head) {var res[];while(head){res.unshift(head.val);headhead.next;}return res;…

JUnit測試Spring Service和DAO(帶有內存數據庫)

這篇文章描述了如何為Spring Web Application的Services和DAO實現JUnit測試。 它建立在Spring MVC-Service-DAO-Persistence Architecture Example的基礎上 。 從Github的Spring-Web-JPA-Testing目錄中可以找到該示例。 提醒 測試裝置 –固定狀態,用作運行測試的基…

c# 正則獲取html標簽內容,c# – 使用正則表達式在多個HTML標記之間獲取文本

使用正則表達式,我希望能夠在多個DIV標記之間獲取文本.例如,以下內容:first html taganother tag輸出:first html taganother tag我使用的正則表達式模式只匹配我的最后一個div標簽并錯過了第一個.碼:static void Main(string[] args){string…

Android之外部存儲(SD卡)

*手機的外部存儲空間,這個我們可以理解成電腦的外接移動硬盤,U盤也行。所有的Android設備都有兩個文件存儲區域:“內部”和“外部”存儲器。這兩個名稱來自早期的Android,當時大多數設備都提供內置的固定的內存(內置存…

通用并發對象池

在本文中,我們將介紹如何在Java中創建對象池。 近年來,JVM的性能成倍增加,大多數類型的對象幾乎都變得多余,從而提高了對象池的性能。 從本質上講,對象的創建不再像以前那樣昂貴。 但是,有些對象在創建時肯…