關(guān)于mysql?left?join?查詢(xún)慢時(shí)間長(zhǎng)的踩坑總結(jié)
問(wèn)題背景
兩張表一張是用戶(hù)表a(主鍵是int類(lèi)型),一張是用戶(hù)具體信息表b(用戶(hù)表id字段是varchar類(lèi)型)。
因?yàn)橐@示用戶(hù)及用戶(hù)信息,所以需要關(guān)聯(lián)查詢(xún),但發(fā)現(xiàn)left join后查詢(xún)緩慢,耗時(shí)太長(zhǎng)。用戶(hù)表數(shù)據(jù)2萬(wàn)左右。
問(wèn)題分析及處理
1、EXPLAIN 命令對(duì) SELECT 語(yǔ)句進(jìn)行分析
type 字段提供了判斷查詢(xún)是否高效的重要依據(jù)依據(jù). 通過(guò) type 字段, 我們判斷此次查詢(xún)是 全表掃描 還是 索引掃描 等.
ALL: 表示全表掃描, 這個(gè)類(lèi)型的查詢(xún)是性能最差的查詢(xún)之一.
通常來(lái)說(shuō), 我們的查詢(xún)不應(yīng)該出現(xiàn) ALL 類(lèi)型的查詢(xún), 因?yàn)檫@樣的查詢(xún)?cè)跀?shù)據(jù)量大的情況下, 對(duì)數(shù)據(jù)庫(kù)的性能是巨大的災(zāi)難. 如一個(gè)查詢(xún)是 ALL 類(lèi)型查詢(xún), 那么一般來(lái)說(shuō)可以對(duì)相應(yīng)的字段添加索引來(lái)避免.
2、新增索引
因?yàn)榘l(fā)現(xiàn)表b字段之前并沒(méi)有建索引。
alter table a add index idx_mbrID (mbrID);
再次Explain分析
發(fā)現(xiàn)type變?yōu)榱藃ef,根據(jù)不同的 type 類(lèi)型的性能關(guān)系(
ALL < index < range ~ index_merge < ref < eq_ref < const < system
)比較后感覺(jué)可以了,于是執(zhí)行查詢(xún)。
3、修改索引字段類(lèi)型一致
執(zhí)行查詢(xún)后發(fā)現(xiàn)執(zhí)行速度并未優(yōu)化,仔細(xì)看之前同事設(shè)計(jì)的表,發(fā)現(xiàn)索引類(lèi)型字段不一致,于是修改為varchar 為int后再次查詢(xún)發(fā)現(xiàn)查詢(xún)速度明顯提升。
即使之前java代碼里面寫(xiě)的string,數(shù)據(jù)庫(kù)改為int目前測(cè)試可正常使用
渣渣總結(jié)
解決完問(wèn)題后,翻起了開(kāi)發(fā)手冊(cè),發(fā)現(xiàn)索引規(guī)約明確強(qiáng)制join時(shí)數(shù)據(jù)類(lèi)型必須一致,被關(guān)聯(lián)字段必須有索引?。?!
關(guān)于Explain用法參考
http://www.dbjr.com.cn/article/167406.htm
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解析mysql數(shù)據(jù)庫(kù)還原錯(cuò)誤:(mysql Error Code: 1005 errno 121)
本篇文章是對(duì)mysql數(shù)據(jù)庫(kù)還原錯(cuò)誤:(mysql Error Code: 1005 errno 121)的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06MySql通過(guò)ip地址進(jìn)行訪問(wèn)的方法
這篇文章主要介紹了MySql通過(guò)ip地址進(jìn)行訪問(wèn)的方法,首先要登錄mysql,切換數(shù)據(jù)庫(kù)然后授權(quán),具體代碼詳情大家參考下本文2018-06-06Win10下免安裝版MySQL8.0.16的安裝和配置教程圖解
這篇文章主要介紹了Win10下免安裝版MySQL8.0.16的安裝和配置 ,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考解決價(jià)值,需要的朋友可以參考下2019-06-06MySQL因配置過(guò)大內(nèi)存導(dǎo)致無(wú)法啟動(dòng)的解決方法
這篇文章主要給大家介紹了關(guān)于MySQL因配置過(guò)大內(nèi)存導(dǎo)致無(wú)法啟動(dòng)的解決方法,文中給出了詳細(xì)的解決示例代碼,對(duì)遇到這個(gè)問(wèn)題的朋友們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06MySQL表名不區(qū)分大小寫(xiě)的設(shè)置方法
今天郁悶死了,在LINUX下調(diào)一個(gè)程序老說(shuō)找不到表,但是我明明是建了表的,在MYSQL的命令行下也可以查到,為什么程序就找不到表呢?2014-04-04MySQL中count()和count(1)有何區(qū)別以及哪個(gè)性能最好詳解
count是一個(gè)函數(shù),用來(lái)統(tǒng)計(jì)數(shù)據(jù),但是count函數(shù)傳入的參數(shù)有很多種,比如count(1)、count(*)、count(字段)等,下面這篇文章主要給大家介紹了關(guān)于MySQL中count()和count(1)有何區(qū)別以及哪個(gè)性能最好的相關(guān)資料,需要的朋友可以參考下2022-08-08MySQL Aborted connection告警日志的分析
這篇文章主要介紹了MySQL Aborted connection告警日志的分析,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下2020-08-08