Mysql慢查詢優化示例

參考(https://blog.csdn.net/lr131425/article/details/61918741

  • 首先使用explain 看一下sql情況

CODE:SQL

select shd.loan_no as loan_no , shd.ps_due_dt as ps_due_dt, shd.ps_perd_no as ps_perd_no, lc.appl_cde as appl_cde, lc.id_no as id_no, lm.daifu_mer_no as mer_no , lc.md_loan_id as md_loan_id from glloans.lm_pm_shd shd left join glloans.lm_loan lm on lm.loan_no = shd.loan_no left join cmis.lpb_appl_dn dn on dn.loan_no = shd.loan_no left join cmis.lc_appl lc on lc.appl_seq = dn.appl_seq where shd.ps_due_dt<=? and shd.daishou_channel in(?+) and shd.setl_ind = ? and shd.ps_perd_no >?

當執行explain會發現shd表查詢type類型是all效率最低的( system>const>index  > range>index_merge>ALL

發現其中where條件裏面存在一個字段非索引 daishou_channel

修改之前查詢所用時間平均0.15

添加索引之後;

CODE:SQL

show index from glloans.lm_pm_shd;

alter table glloans.lm_pm_shd add index idx_daishou_channel(daishou_channel);

alter table glloans.lm_pm_shd drop index idx_daishou_channel ;

添加之後所用時間0.08

後續...索引類型

從數據結構角度https://www.jianshu.com/p/8fd9de502547

1. B-Tree索引

最常見的索引類型,基於B-Tree數據結構。B-Tree的基本思想是,所有值(被索引的列)都是排過序的,每個葉節點到跟節點距離相等。所以B-Tree適合用來查找某一範圍內的數據,而且可以直接支持數據排序(ORDER BY)。但是當索引多列時,列的順序特別重要,需要格外注意。InnoDB和MyISAM都支持B-Tree索引。InnoDB用的是一個變種B+Tree,而MyISAM爲了節省空間對索引進行了壓縮,從而犧牲了性能。

2. Hash索引

基於hash表。所以這種索引只支持精確查找,不支持範圍查找,不支持排序。這意味着範圍查找或ORDER BY都要依賴server層的額外工作。目前只有Memory引擎支持顯式的hash索引(但是它的hash是nonunique的,衝突太多時也會影響查找性能)。Memory引擎默認的索引類型即是Hash索引,雖然它也支持B-Tree索引。

3. Spatial (R-Tree)(空間)索引

只有MyISAM引擎支持,並且支持的不好。可以忽略。

4. Full-text索引

主要用來查找文本中的關鍵字,而不是直接與索引中的值相比較。Full-text索引跟其它索引大不相同,它更像是一個搜索引擎,而不是簡單的WHERE語句的參數匹配。你可以對某列分別進行full-text索引和B-Tree索引,兩者互不衝突。Full-text索引配合MATCH AGAINST操作使用,而不是一般的WHERE語句加LIKE。

 

從邏輯角度

1、主鍵索引:主鍵索引是一種特殊的唯一索引,不允許有空值

2、普通索引或者單列索引

3、多列索引(複合索引):複合索引指多個字段上創建的索引,只有在查詢條件中使用了創建索引時的第一個字段,索引纔會被使用。使用複合索引時遵循最左前綴集合

4、唯一索引或者非唯一索引

5、空間索引:空間索引是對空間數據類型的字段建立的索引,MYSQL中的空間數據類型有4種,分別是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL關鍵字進行擴展,使得能夠用於創建正規索引類型的語法創建空間索引。創建空間索引的列,必須將其聲明爲NOT NULL,空間索引只能在存儲引擎爲MYISAM的表中創建

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