標籤:
SQL分類
和大多數關係型資料庫一樣,mysql也具有以下幾種類型的SQL語句:
DML語句:主要用於新增,修改,刪除和查詢資料庫的記錄,關鍵字:insert,update,delete和select
DCL語句:主要用於控制資料庫物件(庫,表,欄位、使用者等對象)的訪問,關鍵字:grant,revoke
DDL語句:主要用於定義和修改資料庫物件的結構,常用關鍵字:create,drop,alter
註:DML(DELETE,UPDATE,SELECT)才 是我們關注的重點,而其中DELETE,UPDATE語句都可以轉換為SELECT(查詢)語句進行檢查和最佳化,本ppt所有最佳化涉及語句預設都是SELECT語句。
SQL執行流程
用戶端發送一條查詢語句給伺服器
伺服器先會檢查查詢快取,如果命中了緩衝,則立即返回儲存在緩衝中的結果。否則進入下一階段;
伺服器端進行SQL解析、預先處理,再由最佳化器產生對應的執行計畫;
MySQL根據最佳化器產生的執行計畫,調用儲存引擎的API來執行查詢;
將結果返回給用戶端。
查詢快取:將sql做hash計算,將得到的hash值在查詢快取中搜尋,如果存在,則校正許可權,如果許可權通過,將直接從緩衝中獲得查詢的結果資料,並返回給用戶端。無需進行解析、最佳化、執行等消耗資源的操作。
解析器:對sql語句進行文法解析,驗證,比如檢查是否使用錯誤的關鍵字,使用關鍵字的順序是否正確等。
前置處理器:在上一步完成的基礎上,進一步檢查資料表或資料列是否存在,欄位是否存在,表的別名、欄位是否有效。
查詢最佳化器:以上步驟完成後,將開始產生執行計畫,一條sql有很多種執行計畫,mysql的最佳化器的最終會根據各種最佳化策略來選擇和確定一條最優的執行計畫。
查詢執行引擎:接收到查詢最佳化工具最終確定的最優執行計畫,並開始按執行計畫執行,在執行過程中,會調用儲存引擎(innodb,myisam,memory等)的介面來實現各種操作。
註:各種引擎共有的特性是由伺服器層來實現的,比如預存程序、 觸發器、各種日期時間函數和字串函數等。
返回結果給用戶端:此步為查詢執行操作的最後一步,當mysql伺服器處理完sql語句的所有步驟,開始產生結果時,就開始向用戶端發送結果集了。當結果集全部發送完成後,此次sql語句全部執行完成。 SQL問題排查工具
- show processlist
- explain
- show index from tablename
show processlist
該工具可以簡單而有效查看當前mysql伺服器的線程目前的狀態,通常作為問題排查的入口之一,以下是執行結果的重點列說明:
- sid:mysql內部進程標識,通常kill語句時使用。
- user:顯示當前串連使用者名稱。
- host:顯示串連是從哪個ip的哪個連接埠上發出的。
- db:顯示這個進程目前使用是哪個資料庫。
- command:顯示當前串連的執行的命令,一般就是休眠(sleep),查詢(query),串連(connect)。
- time:此這個狀態持續的時間,單位是秒。
- state:顯示使用當前串連的sql語句的狀態,非常重要的列,通常為排查問題的入口。
- Info:顯示這個sql語句,因為長度有限,所以長的sql語句就顯示不全,full 但是一個判斷問題語句的重要依據。
explain
explain結果顯示MySQL如何使用處理select語句以及串連表。
- id:序號,即為sql執行的順序。
- select_type:select類型,通常有simple,primary,union,dependent union等
- table:該步操作涉及的表
- type:連線類型,常用const,eq_ref,ref,index,ALL等
- possible_keys :提示使用哪個索引會在該表中找到行
- keys:實際執行計畫使用的索引
- key_len:使用的索引長度
- ref:顯示使用哪個列或常數與key一起從表中選擇行。
- rows:顯示MYSQL執行查詢需要檢查的行數。
- Extra:該列包含解決查詢的重要訊息,非常重要!
show index from tablename
這條命令有助於我們檢查表的索引情況,是所有查詢調優的基礎。以下是執行結果的重點列說明:
- Table 表名。
- Non_unique 如果索引不包括重複值,則為0,否則為1。
- Key_name 索引的名稱,主鍵的名稱通常為primary。
- Seq_in_index 列在索引中位置,從1開始。
- Column_name 列的名稱。
- Collation 列以什麼方式儲存在索引中。在MySQL中,有值‘A‘(升序)或NULL(不排序)。
- Cardinality 索引中唯一值的數目的估計值。基數越大,當進行關聯查詢時,MySQL使用該索引的機會就越大。
- Sub_part 如果列只是被部分值索引,則為索引列的字元的數目。如果整列被索引,則為NULL。
- Null 如果列有NULL值,則為YES。如果沒有null值,則該列含有NO。
- Index_type 索引的類型(BTREE, FULLTEXT, HASH, RTREE)。
基本sql語句--sql執行流程及調優