查詢優化,索引優化,庫表結構優化需要齊頭並進,乙個不落。
首先要稍微了解一下查詢執行的基礎,當希望mysql高效能執行查詢時,最好的辦法就是弄清楚mysql是如何優化和執行查詢的。一旦理解這一點,很多查詢工作實際上就是遵循一些原則讓優化器能夠按照預想的合理方式執行。
當客戶端傳送了乙個sql查詢請求,那麼mysql伺服器首先去查詢快取,如果快取命中,則跳過所有的步驟,直接返回結果。這個檢查是對乙個雜湊查詢,即時有乙個位元組的不同,也不會匹配快取。
生命週期的下一步是將乙個sql轉化成乙個執行計畫,mysql再依照這個執行計畫和儲存引擎進行互動。
1,語法解析:將sql生成一顆對應的解析樹,期間進行語法檢查,一旦發現錯誤就終止查詢。
2,預處理:檢查表名,列名是否存在,別名是否有歧義等。
3,查詢優化器:作用是將解析樹轉化為執行計畫。一條sql可以有很多種執行方式,最後都返回相同的結果。優化器的作用是找到最好的執行計畫。mysql使用基於成本的優化器,它將嘗試**乙個查詢使用某種計畫時的成本,並選擇其中最小的乙個。最初,成本最小單位是隨機讀取乙個4k資料頁的成本,後來成本公式就變得很複雜。
可以用語句 show status like 『last_query_cost』來檢視上一次查詢的查詢成本。得到的值為查詢資料頁的個數(資料頁的概念應該是跟作業系統有關係的,比如4kb資料為乙個資料頁,不同的作業系統可能會不一樣)。值得注意的是,估算跟實際執行還是有不一致的時候,也就是說優化器選擇的方案也可能不是最優的。比如有的執行計畫雖然需要讀取更多的頁面,但是這些讀取的成本卻很小,比如這些資料是順序存放的。
下面是mysql能夠處理的優化型別:
3.1,重新定義關聯表的順序: 資料表的關聯並不總是按照查詢中指定的順序進行。決定關聯的順序是優化器很重要的一部分功能。
3.2,將外連線轉化為內連線
3.3,使用等價變換規則:例如將 5=5 and a<5優化為a<5
3.4,優化count,min,max:例如,如果此列有b-tree索引,那麼在優化的時候,會直接取b-tree最左邊的值(min),將其作為乙個常數。在執行的時候,這一步就略了,因為優化的時候已經是乙個常數了。對於myisam儲存引擎,因為其維護了乙個count值,所以在沒有where的查詢中,直接用這個值來替代count語句。
3.5,預估並轉化為常數表示式:
3.6,檢查是否能夠使用覆蓋索引
3.7,子查詢優化:mysql在某些情況下可以將自查詢轉換為一種效率更高的形式,,從而減少多個查詢多次對資料進行訪問。
3.8,其他優化
資料和索引的統計資訊:
在伺服器層有查詢優化器,卻沒有儲存資料和索引的統計資訊。統計資訊由儲存引擎實現,不同的儲存引擎可能會儲存不同的統計資訊。mysql查詢優化器在生成查詢的執行計畫時,需要向儲存引擎獲取統計資訊。包括:每個表或者索引有多少個頁面,索引的分布資訊等。
mysql如何執行關聯查詢
先來看乙個union查詢的列子,mysql先將一系列的單個查詢結果放到乙個臨時表中,然後重新讀出臨時表資料來完成union查詢。在mysql的概念中,每個查詢都是一次關聯,讀取結果臨時表也算也此關聯。
對於兩個表關聯的情況,也許有人會認為具體執行像程式語言中的雙層for迴圈,事實其實也是這樣。
mysql執行關聯查詢的的操作很固定,即mysql先在乙個表中迴圈去除單挑資料,然後再巢狀迴圈到下乙個表中尋找匹配的行,一次下去。
關聯查詢優化器:它決定了多個表關聯時的順序。通常多表關聯的時候,可以有多種不同的關聯順序獲得相同的執行結果。關聯查詢優化器通過評估不同的順序的成本來選擇乙個代價最小的關聯順序。面試的時候總有人問錶的連線順序,其實這些東西最後都會被mysql伺服器優化的。
mysql查詢過程 MySQL查詢執行過程
mysql查詢執行路徑 1.客戶端傳送一條查詢給伺服器 2.伺服器先會檢查查詢快取,如果命中了快取,則立即返回儲存在快取中的結果。否則進入下一階段 3.伺服器端進行sql解析 預處理,再由優化器生成對應的執行計畫 4.mysql根據優化器生成的執行計畫,呼叫儲存引擎的api來執行查詢 5.將結果返回...
MySQL查詢語句執行過程
先上圖 眾所周知在mysql資料庫應用中查詢請求是使用最多的,假設我們輸入下面的sql,通過客戶端請求mysql伺服器,會得到乙個包含user的結果集。但是,其中mysql的處理過程我們並不了解,那麼下面就讓我們一起看看在查詢請求前後mysql服務端發生了些什麼吧。如上圖所示,整張圖由三部分組成,從...
MYSQL執行過程
一條查詢語句執行過程 1.先確定 鏈結方式 分為 同步 和 非同步 一般是同步 2.鏈結方式 分為 長鏈結 和 短鏈結 長鏈結是操作後不會馬上關掉會保持一段時間 短鏈結操作後會馬上關掉。長連線mysql會保持28800秒 8小時 這個時間可以改 mysql 預設最大鏈結數量151個 修改最大鏈結數量...