本篇文章給大家帶來了關于mysql的相關知識,其中主要介紹了關于left join查詢慢時間長的踩坑總結,包括了EXPLAIN命令對SELECT語句進行分析,下面一起來看一下,希望對大家有幫助。
程序員必備接口測試調試工具:立即使用
Apipost = Postman + Swagger + Mock + Jmeter
Api設計、調試、文檔、自動化測試工具
后端、前端、測試,同時在線協作,內容實時同步
推薦學習:mysql視頻教程
問題背景
兩張表一張是用戶表a(主鍵是int類型),一張是用戶具體信息表b(用戶表id字段是varchar類型)。
因為要顯示用戶及用戶信息,所以需要關聯查詢,但發現left join后查詢緩慢,耗時太長。用戶表數據2萬左右。
問題分析及處理
1、EXPLAIN 命令對 SELECT 語句進行分析
type 字段提供了判斷查詢是否高效的重要依據依據. 通過 type 字段, 我們判斷此次查詢是 全表掃描 還是 索引掃描 等.
ALL: 表示全表掃描, 這個類型的查詢是性能最差的查詢之一.
通常來說, 我們的查詢不應該出現 ALL 類型的查詢, 因為這樣的查詢在數據量大的情況下, 對數據庫的性能是巨大的災難. 如一個查詢是 ALL 類型查詢, 那么一般來說可以對相應的字段添加索引來避免.
2、新增索引
因為發現表b字段之前并沒有建索引。
alter table a add index idx_mbrID (mbrID);
再次Explain分析
發現type變為了ref,根據不同的 type 類型的性能關系(
ALL < index < range ~ index_merge < ref < eq_ref < const < system
)比較后感覺可以了,于是執行查詢。
3、修改索引字段類型一致
執行查詢后發現執行速度并未優化,仔細看之前同事設計的表,發現索引類型字段不一致,于是修改為varchar 為int后再次查詢發現查詢速度明顯提升。
即使之前java代碼里面寫的string,數據庫改為int目前測試可正常使用
總結
解決完問題后,翻起了開發手冊,發現索引規約明確強制join時數據類型必須一致,被關聯字段必須有索引!!!
推薦學習:mysql視頻教程