前面幾篇文章比較多地介紹了Hive的查詢優化技巧,
今天抽一小篇幅介紹Mysql的查詢優化技巧。
索引是Mysql查詢優化的王牌!所以今天的內容是如何合理使用索引從而做到Mysql查詢優化。
有小夥伴可能會問,現在都2021了,誰還用Mysql?其實不然,在很多初創互聯網、或傳統大企業的數分環境的確還是基於RDBMS的,所以掌握好Mysql很必要!!!
接下來直接進入正題。
一、什麼是索引?
簡單說 ,在關係數據庫(RDBMS)中,索引是一種單獨的、物理的對數據庫表中一列或者多列值進行排序的一種存儲結構。相當於圖書的目錄,可以根據目錄中的頁碼快速找到需要的內容。
所以,當查詢表有索引且我們的查詢 SQL 有正確使用索引時,查詢引擎可以根據索引進行快速查找,而不需進行全表掃描。
常規的我們把索引分爲單列索引、組合索引:
如,某張表有以下字段:doctor_id、patient_id、hospital_id、pay_ment、date。
- 單列索引爲一個索引只包含單個列,如:以 doctor_id 爲索引;
- 組合索引即一個索引包含多個列,如:以 doctor_id、patient_id 兩字段列組合作爲索引。
二、如何使用索引?
查詢語句要怎麼寫才能發揮索引的優化效果呢?
基礎的,在我們的 where 子句中儘可能直接使用索引所謂切片限制條件!
另外的,一些坑我們要規避(這些坑會使索引無法真正發揮作用):
- 索引列使用 like 子句進行模糊匹配:like “%aaa%” 不會使用索引,只有like “aaa%”可使用索引
- 索引列上進行運算:select * from users where YEAR(adddate)<2007 不會使用索引,改成則能使用上索引 select * from users where adddate<'2007-01-01'
- 當使用到組合索引時,以最左前綴的方式組合纔可:如 doctorid、patient_id 兩個字段的組合索引,where 條件限制 doctor_id或doctor_id+patient_id均可使用索引,但直接使用patient_id則無法使用索引。
- 只有以下邏輯判斷符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的 like,其他運算符會使索引無法真正發揮價值。
最後提醒一下,索引是有物理存儲的,雖然它能大大提高查詢速度,但同時也會降低更新表的速度。所以要合理地創建索引。當然這是DBA的工作了,我們作爲分析師最終還是利用好索引的查詢優化作用。
好看不忘點贊、收藏。歡迎評論區交流討論!