合理使用索引進行Mysql查詢優化 - 知乎

前面幾篇文章比較多地介紹了Hive的查詢優化技巧,

30分鐘入門 Hive SQL

30分鐘掌握 Hive SQL 優化

最全SQL窗口函數指南


今天抽一小篇幅介紹Mysql的查詢優化技巧。

索引是Mysql查詢優化的王牌!所以今天的內容是如何合理使用索引從而做到Mysql查詢優化。

有小夥伴可能會問,現在都2021了,誰還用Mysql?其實不然,在很多初創互聯網、或傳統大企業的數分環境的確還是基於RDBMS的,所以掌握好Mysql很必要!!!

接下來直接進入正題。

一、什麼是索引?

簡單說 ,在關係數據庫(RDBMS)中,索引是一種單獨的、物理的對數據庫表中一列或者多列值進行排序的一種存儲結構。相當於圖書的目錄,可以根據目錄中的頁碼快速找到需要的內容。

所以,當查詢表有索引且我們的查詢 SQL 有正確使用索引時,查詢引擎可以根據索引進行快速查找,而不需進行全表掃描。

常規的我們把索引分爲單列索引、組合索引:

如,某張表有以下字段:doctor_idpatient_idhospital_id、pay_ment、date。

  1. 單列索引爲一個索引只包含單個列,如:以 doctor_id 爲索引;
  2. 組合索引即一個索引包含多個列,如:以 doctor_idpatient_id 兩字段列組合作爲索引。

二、如何使用索引?

查詢語句要怎麼寫才能發揮索引的優化效果呢?

基礎的,在我們的 where 子句中儘可能直接使用索引所謂切片限制條件!

另外的,一些坑我們要規避(這些坑會使索引無法真正發揮作用):

  1. 索引列使用 like 子句進行模糊匹配:like “%aaa%” 不會使用索引,只有like “aaa%”可使用索引
  2. 索引列上進行運算:select * from users where YEAR(adddate)<2007 不會使用索引,改成則能使用上索引 select * from users where adddate<'2007-01-01'
  3. 當使用到組合索引時,以最左前綴的方式組合纔可:如 doctorid、patient_id 兩個字段的組合索引,where 條件限制 doctor_id或doctor_id+patient_id均可使用索引,但直接使用patient_id則無法使用索引。
  4. 只有以下邏輯判斷符才使用索引:<,<=,=,>,>=,between,in,以及某些時候的 like,其他運算符會使索引無法真正發揮價值。

最後提醒一下,索引是有物理存儲的,雖然它能大大提高查詢速度,但同時也會降低更新表的速度。所以要合理地創建索引。當然這是DBA的工作了,我們作爲分析師最終還是利用好索引的查詢優化作用。

好看不忘點贊、收藏。歡迎評論區交流討論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章