現在sql調校有兩種方向,一種是透過增加快取的方式,例如透過使用redis , mybites 一二級快取來提高搜尋效率。 第二種是透過使用explain來分析慢搜尋的sql陳述式, 找到該敘述的問題從而進行調校。
這裡對使用explain來進行調校的方式做一些介紹。
使用方式: explain + sql => 執行 => 檢視結果
使用explain會列印出來資料庫引擎在底層執行sql陳述式是具體是怎麼做的。
舉個範例:
使用explain對這條sql陳述式進行具體的分析。
1 | explain (ANALYZE on ,TIMING on, VERBOSE on, BUFFERS on, COSTS on )select data_date from e_mp_energy_month where data_date between to_date('2021-02','yyyy-mm-dd') and to_date('2021-02','yyyy-mm-dd') and meter_id in ( 20122700000146 , 20122700000147 , 20122700000148 , 20122700000149 , 20122700000150 , 20122700000151 , 20122700000152 , 20122700000153 , 20122700000154 , 20122700000155 , 20122700000156 , 20122700000157 , 20122700000158 , 20122700000159 , 20122700000160 , 20122700000161 , 20122700000162 , 20122700000163 , 20122700000164 ) order by meter_id,data_date asc |

在顯示的結果中, cost表示對啟動成本和總成本的預估。 cost後面第一個數值代表啟動成本(搜尋到第一行所需要的成本), 第二個數值表示搜尋結束所需要的成本。

Seq Scan表示這條sql的執行方式時 順序掃描表。
actual time 表示實際的執行時間(單位毫秒)
buffers -> shared hit 表示在記憶體中讀到了多少塊。
filter表示過濾條件。
需要注意的一點是 , 使用了ANALYZE欄位的explain, 是真正會執行的 ,修改不可逆。 不使用ANALYZE的explain,只是預執行,不會改變資料庫中實際資料。
使用ANALYZE可以獲得資料庫實際執行時間, 但是修改不可逆, 要想結果可逆, 需要手動rollback。
個人認為,調校後sql, cost的值越小越好 , buffers shared hit的值越高越好。