關(guān)于mysql?left?join?查詢慢時間長的踩坑總結(jié)
問題背景
兩張表一張是用戶表a(主鍵是int類型),一張是用戶具體信息表b(用戶表id字段是varchar類型)。
因為要顯示用戶及用戶信息,所以需要關(guān)聯(lián)查詢,但發(fā)現(xiàn)left join后查詢緩慢,耗時太長。用戶表數(shù)據(jù)2萬左右。

問題分析及處理
1、EXPLAIN 命令對 SELECT 語句進行分析

type 字段提供了判斷查詢是否高效的重要依據(jù)依據(jù). 通過 type 字段, 我們判斷此次查詢是 全表掃描 還是 索引掃描 等.
ALL: 表示全表掃描, 這個類型的查詢是性能最差的查詢之一.
通常來說, 我們的查詢不應該出現(xiàn) ALL 類型的查詢, 因為這樣的查詢在數(shù)據(jù)量大的情況下, 對數(shù)據(jù)庫的性能是巨大的災難. 如一個查詢是 ALL 類型查詢, 那么一般來說可以對相應的字段添加索引來避免.
2、新增索引
因為發(fā)現(xiàn)表b字段之前并沒有建索引。
alter table a add index idx_mbrID (mbrID);
再次Explain分析

發(fā)現(xiàn)type變?yōu)榱藃ef,根據(jù)不同的 type 類型的性能關(guān)系(
ALL < index < range ~ index_merge < ref < eq_ref < const < system
)比較后感覺可以了,于是執(zhí)行查詢。

3、修改索引字段類型一致
執(zhí)行查詢后發(fā)現(xiàn)執(zhí)行速度并未優(yōu)化,仔細看之前同事設計的表,發(fā)現(xiàn)索引類型字段不一致,于是修改為varchar 為int后再次查詢發(fā)現(xiàn)查詢速度明顯提升。
即使之前java代碼里面寫的string,數(shù)據(jù)庫改為int目前測試可正常使用

渣渣總結(jié)
解決完問題后,翻起了開發(fā)手冊,發(fā)現(xiàn)索引規(guī)約明確強制join時數(shù)據(jù)類型必須一致,被關(guān)聯(lián)字段必須有索引?。?!


關(guān)于Explain用法參考
http://www.dhdzp.com/article/167406.htm
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL性能優(yōu)化之table_cache配置參數(shù)淺析
這篇文章主要介紹了MySQL性能優(yōu)化之table_cache配置參數(shù)淺析,本文介紹了它的緩存機制、參數(shù)優(yōu)化及清空緩存的命令等,需要的朋友可以參考下2014-07-07
MySQL窗口函數(shù) over(partition by)的用法
本文主要介紹了MySQL窗口函數(shù) over(partition by)的用法, partition by相比較于group by,能夠在保留全部數(shù)據(jù)的基礎(chǔ)上,只對其中某些字段做分組排序,下面就來介紹一下具體用法,感興趣的可以了解一下2024-02-02
mysql如何查詢兩個日期之間最大的連續(xù)登錄天數(shù)
在現(xiàn)在的很多網(wǎng)站中都有這樣一個功能。記錄用戶的連續(xù)登陸天數(shù),所謂的連續(xù)在線是指相鄰兩天都登錄過,不一定一直在線,但是只要有過登錄即可。這篇文章主要介紹的是利用sql語句如何查詢在兩個日期之間最大的連續(xù)登錄天數(shù),有需要的朋友們下面來一起看看吧。2016-10-10
一文詳解MYSQL的多版本并發(fā)控制MVCC(Multi-Version Concurrency Co
MVCC是一種用于數(shù)據(jù)庫管理系統(tǒng)的并發(fā)控制技術(shù),允許多個事務同時訪問數(shù)據(jù)庫,而不會導致讀寫沖突,本文就詳細的介紹了MVCC的具體用法,具有一定的參考價值,感興趣的可以了解一下2023-10-10
MySQL中建表時可空(NULL)和非空(NOT NULL)的用法詳解
這篇文章主要介紹了MySQL中建表時可空(NULL)和非空(NOT NULL)的用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
服務器不支持 MySql 數(shù)據(jù)庫的解決方法
出現(xiàn)問題:報錯“服務器不支持 MySql 數(shù)據(jù)庫”,改函數(shù)function_exists('mysql_connect')返回 false2013-03-03

