mysql流程
1、客服端/伺服器通訊協議
2、查詢快取
3、語法解析器和預處理,解析樹
4、查詢優化器(一條查詢有很多種執行方式,它作用就在於找到最好的執行計畫)
5、查詢執行計畫
6、查詢執行引擎,api呼叫
向mysql傳送乙個請求都做了什麼?
1、客戶端傳送一條查詢給伺服器。
2、伺服器先檢查查詢快取,如果命中了快取,則立刻返回儲存在快取中的結果。否則 進入下一階段。
3、伺服器端進行sql解析、預處理,再由優化器生成對應的執行計畫。
4、mysql根據優化器生成的執行計畫,呼叫儲存引擎的api來執行查詢。
5、將結果返回給客戶端。
複雜查詢分解為有哪些單個查詢的好處?
1、讓快取的效率更髙。許多應用程式可以方便地快取單錶查詢對應的結果物件。例如, 上面查詢中的tag已經被快取了,那麼應用就可以跳過第乙個查詢。再例如,應用 中已經快取了 id為123、567、9098的內容,那麼第三個查詢的in()中就可以少 幾個id。另外,對mysql的查詢快取來說&6,如果關聯中的某個表發生了變化, 那麼就無法使用查詢快取了,而拆分後,如果某個表很少改變,那麼基於該錶的查 詢就可以重複利用查詢快取結果了。
2、將查詢分解後,執行單個查詢可以減少鎖的競爭。
3、在應用層做關聯,可以更容易對資料庫進行拆分,更容易做到髙效能和可擴充套件。
4、查詢本身效率也可能會有所提公升。這個例子中,使用in ()代替關聯查詢,可以讓 mysql按照id順序進行查詢,這可能比隨機的關聯要更高效。我們後續將詳細介 紹這點。
5、可以減少冗餘記錄的查詢。在應用層做關聯查詢,意味著對於某條記錄應用只需要 查詢一次,而在資料庫中做關聯查詢,則可能需要重複地訪問一部分資料。從這點看, 這樣的重構還可能會減少網路和記憶體的消耗。
6、更進一步,這樣做相當於在應用中實現了雜湊關聯,而不是使用mysql的巢狀循 環關聯。某些場景雜湊關聯的效率要髙很多(本章後續我們將討論這點)。
mysql查詢和索引
索引可以查詢鎖定更少的行。如果你的查詢訪問那些不需要的行,那麼就會鎖定更少的行。雖然innodb的行鎖效率很高,記憶體使用也很少,但是鎖定行的時候任然會帶來額外的開銷;還有,鎖定超過需要的行會增加鎖徵用並減少併發性。
inoodb在二級索引上,使用共享(讀)鎖,但訪問主鍵索引需要排他(寫)鎖。這消除了使用覆蓋索引的可能性,並且使得select for update 比lock in share mode 或非索引查詢要慢很多。
表損壞&修復表
表損壞是很槽糕的事情。對於myisam儲存引擎,表損壞通常是系統崩潰導致的。其他的引擎也會由於硬體問題、mysql本身的缺陷或者作業系統的問題導致索引損壞。
check table 通常能夠找出大多數的表和索引的錯誤。可以使用repair table命令來修復損壞的表,但同樣不是所有的儲存引擎都支援該命令。
減少索引和資料碎片
b-tree索引可能會碎片化,這會降低查詢的效率。碎片化的索引可能會以很差或者無序的方式儲存在磁碟上。
根據設計,b-tree需要隨機磁碟訪問才能定位到葉子也,所以隨機訪問是不可避免的。然而,如果葉子頁在物理分布上是順序且緊密的,那麼查詢的效能會更好。
資料碎片化分為三種:行碎片,行間碎片,剩餘空間碎片。
對於myisan表,這三類碎片化都可能發生。但是innodb不回出現短小的行碎片;inoodb會移動短小的行並重寫到乙個片段上。
可以通過optimize table來整理碎片,多數儲存引擎都有效。
選擇索引和編寫利用這些索引的查詢,有三個原則:
1、單行訪問是很慢的。特別是機械硬碟儲存中(ssd的隨機i/o是公認的快),如果伺服器從儲存中讀取乙個儲存塊,只是為了一行資料,那未免有些浪費。所以在讀取的時候,盡可能查詢更多行的資料
2、按順序訪問範圍資料是很快的,並且group by 查詢也無需再做排序和將行組進行聚合計算了。
3、索引覆蓋查詢是很快的。如果乙個索引包含了查詢的所有列,那麼儲存引擎就不需要再回表查詢行來。避免了大量的單行訪問。
為什麼查詢要盡可能查詢實際使用的資料,避免*這種?
這種查詢不僅給mysql伺服器帶來額外的負擔,還增加了網路開銷,特別是資料庫和應用伺服器不在同乙個主機上,網路開銷(資料傳輸)就很明顯了,即使都在同乙個主機上依然會有網路開銷。另外會增加應用伺服器的cpu和記憶體資源。補充一點,也會增加磁碟i/o壓力。
//@todo 有時間再整理
MySQL 索引與查詢優化
本文介紹一些優化 mysql 索引設計和查詢的建議。在進行優化工作前,請務必了解mysql explain命令 檢視執行計畫 索引在邏輯上是指從索引列 關鍵字 到資料的對映,通過索引可以快速的由關鍵字查詢到資料記錄。順序查詢複雜度為o n 樹狀索引查詢複雜度為o logn 雜湊索引為o 1 mysq...
mysql負向查詢索引 談談MySQL 索引
1 索引是什麼 索引 index 是幫助mysql高效獲取資料的資料結構。我們可以簡單理解為 索引的目的在於提高查詢效率。2 原理 索引的資料結構是b 樹,原理圖如下 精簡描述 b 樹是為了磁碟或其他直接儲存輔助裝置設計的一種平衡查詢樹。在b 樹中,所有記錄節點都是按鍵值的大小順序存放在葉子節點上,...
MySQL索引原理與慢查詢優化
索引的目的在於提高查詢效率,可以模擬字典,如果要查 mysql 這個單詞,我們肯定需要定位到m字母,然後從下往下找到y字母,再找到剩下的sql。如果沒有索引,那麼你可能需要把所有單詞看一遍才能找到你想要的,如果我想找到m開頭的單詞呢?或者w開頭的單詞呢?是不是覺得如果沒有索引,這個事情根本無法完成?...