新聞中心
MySQL Left Join(左連接) 耗時嚴(yán)重的問題
現(xiàn)象:列表頁因超時查不出來東西,使用postman模擬請花費40多秒,將sql語句單獨提出來后查詢速度非常慢,40多秒
成都創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、清河門網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、html5、商城網(wǎng)站定制開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為清河門等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
先上結(jié)論:
在兩個表關(guān)聯(lián)字段上建立索引解決此問題,下面的內(nèi)容比這句話爽多了,請繼續(xù)看
表結(jié)構(gòu)如下:
users(用戶)表:id,name
integal_record(分?jǐn)?shù)記錄)表:id,user_id,integal_id
其中,integal_record表的user_id關(guān)聯(lián)著users表的id,業(yè)務(wù)目的是查詢每個員工閱讀次數(shù)、評論次數(shù)和積分總和,查詢語句如下:
(里面寫死的值是我從mybatis里扣出來的)
integral_id=1代表著閱讀,integral_id=2代表著評論
查詢時間快半分鐘是無法讓人接受的,從表象的SQL語句來說,首先我們看到有很多SUM函數(shù),因此我們來測試下SUM函數(shù)的計算時間,如下查詢每個人閱讀的累計次數(shù):
可以看出來計算時間很長和SUM函數(shù)沒什么關(guān)系,再看整個SQL除了一些SUM函數(shù)外就剩下users表左聯(lián)integal_record表,我們把條件去掉,直接就寫個左查詢試試
amazing,我的users表里有13400條數(shù)據(jù),關(guān)聯(lián)的integral_record 表里也有13000條數(shù)據(jù),僅僅做了左連接竟然花費了70秒,這肯定是超時的元兇;所以我們explain一下,看看mysql對這條數(shù)據(jù)的查詢策略:
查看結(jié)果:
我們看到type字段的結(jié)果是All,也就是代表全表掃描,那么就好辦了,建立索引即可,其中users表中的id屬于主鍵,策略自增,有默認(rèn)的索引,不在考慮范圍內(nèi),我們僅需對integral_record表增加索引即可:
繼續(xù)執(zhí)行左聯(lián)語句查看運行時間:
時間仍然很久,索引并沒有起作用,這里排除一些逃避困難時的迷信想法:mysql有bug 或者navicat有bug,有網(wǎng)絡(luò)問題 哈哈哈.....我們來看左聯(lián)的關(guān)鍵屬性:
執(zhí)行時間從60多秒變成了0.375s,整個世界都安靜了,再次explain一下
發(fā)現(xiàn)mtemp(integal)表的檢索方式從all變成了ref,索引,快的一批,深呼吸....
希望繼續(xù)遇到這種sql需要優(yōu)化的問題來增加sql調(diào)優(yōu)相關(guān)經(jīng)驗
什么是mysql左鏈接查詢 如何使用
一般所說的左連接,外連接是指左外連接,右外連接。做個簡單的測試你看吧。
先說左外連接和右外連接:
[TEST1@orcl#16-12月-11] SQLselect * from t1;
ID NAME
---------- --------------------
1 aaa
2 bbb
[TEST1@orcl#16-12月-11] SQLselect * from t2;
ID AGE
---------- ----------
1 20
3 30
左外連接:
[TEST1@orcl#16-12月-11] SQLselect * from t1 left join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
2 bbb
右外連接:
[TEST1@orcl#16-12月-11] SQLselect * from t1 right join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
3 30
從上面的顯示你可以看出:左外連接是以左邊的表為基準(zhǔn)。通俗的講,先將左邊的表全部顯示出來,然后右邊的表id與左邊表id相同的記錄就“拼接”上去,比如說id為1的記錄。如果沒有匹配的id,比如說t1中id為2的t2中就沒有。那邊就以null顯示。
右外連接過程正好相反。
再看內(nèi)連接:
[TEST1@orcl#16-12月-11] SQLselect * from t1 inner join t2 on t1.id=t2.id;
ID NAME ID AGE
---------- -------------------- ---------- ----------
1 aaa 1 20
看到?jīng)]有? 只有一條記錄。內(nèi)連接就是只取出符合過濾條件的記錄 也就是t1.id=t2.id 那么符合t1.id=t2.id的記錄只有id=1這一條,所以只顯示一條。 不像外連接,是將你作為基準(zhǔn)的表(左外連接就是左邊表為基準(zhǔn),右外連接就是右邊表為基準(zhǔn))的所有行都顯示出來。
mysql 多張表做左連接操作 SQL應(yīng)該如何寫
error:1054 ???應(yīng)該會明確告訴你那個字段什么的不存在吧,你檢查一下?
為什么要用子查詢呢,寫一層sql查詢就可以了啊。
select?d.*,ds.stages_id,?ds.mosters_id,?dsm.monsters_id,?dsm.moster_id,?dsm.pos
from?dungeon_info?as?d?LEFT?JOIN?dungeon_stage_info?as?ds?on?d.dungeon_id?=?ds.dungeon_id
LEFT?JOIN
dungeon_stage_moster_info?as?dsm?on?ds.monsters_id?=?dsm.monsters_id
如何利用MySQL實現(xiàn)等值連接,左連接和右連接
三種連接的語法
為便于更多的技友快速讀懂、理解,我們只討論2張表對象進行連接操作的情況,大于2張表對象進行的連接操作原理也是一樣的。
1.左連接(LEFT JOIN )
SELECT M.columnname……,N.* columnname…..
FROM left_table M LEFT JOIN right_table N ON M.columnname_join=N.columnname_join AND N.columnname=XXX
WHERE M.columnname=XXX…..
MySQL之主鍵、外鍵、連接
設(shè)置主鍵的思路:業(yè)務(wù)字段做主鍵、自增字典做主鍵、手動賦值字段做主鍵。
多表查詢:分散在多個不同的表里的數(shù)據(jù)查詢出來的操作。
外鍵:從表中用來引用主表中數(shù)據(jù)的那個公共字段。
連接有2種類型的連接:內(nèi)連接(inner join)和外連接(outer join)
內(nèi)連接:查詢結(jié)果只返回符合連接條件的記錄。
外連接:查詢結(jié)果返回某一個表中的所有記錄,以及另一個表中滿足連接條件的記錄。
其中左連接:left join,返回左表中的所有記錄,以及右表中符合連接條件的記錄。
右連接:right join,返回右表中的所有記錄,以及左表中符合連接條件的記錄。
mysql為什么要有左外連接和右外連接?
以下均為個人看法,不喜勿噴。
(1)寫法上的區(qū)別
現(xiàn)在是兩張表,寫起來簡單,如果是多張表,多種連接,甚至包含子查詢,那么如果只存在左連接或者右連接,那么寫法上會麻煩很多。
比如 a left join b on XXX=xxxx
right join c XXX=xxxx
left join d XXX=xxx
where a.xxxx=F.xxxx
等等,甚至更麻煩一些,那么只存在一種連接的話,改寫起來就會比較麻煩。
(2)語句只是工具
習(xí)慣上我們一般會找一個主表(起主要作用的表),并從它開始寫相應(yīng)的語句,假設(shè)只存在一種連接,那么為了寫語句就可能會打亂思維方式。語句只是工具,當(dāng)然是怎么方便怎么來,所以二者相應(yīng)的都存在。
(3)語言的規(guī)范性
我說的是編程語言,只有左沒有右,就好像只有前沒有后,內(nèi)部解析的時候可能都是一樣的,但是外部寫作的時候必須是完整的,如果只有做沒有右,那么可能就是缺失的。
文章題目:mysql左連接怎么實現(xiàn),mysql 右連接
文章路徑:http://www.dlmjj.cn/article/hccssj.html