一雷绢、為什么要用小表驅(qū)動大表
1、驅(qū)動表的定義
當進行多表連接查詢時理卑, [驅(qū)動表] 的定義為:
1)指定了聯(lián)接條件時翘紊,滿足查詢條件的記錄行數(shù)少的表為[驅(qū)動表]
2)未指定聯(lián)接條件時,行數(shù)少的表為[驅(qū)動表](Important!)
2藐唠、mysql關(guān)聯(lián)查詢的概念:
MySQL 表關(guān)聯(lián)的算法是 Nest Loop Join帆疟,是通過驅(qū)動表的結(jié)果集作為循環(huán)基礎(chǔ)數(shù)據(jù),然后一條一條地通過該結(jié)果集中的數(shù)據(jù)作為過濾條件到下一個表中查詢數(shù)據(jù)宇立,然后合并結(jié)果踪宠。
例: user表10000條數(shù)據(jù),class表20條數(shù)據(jù)
select * from user u left join class c u.userid=c.userid
這樣則需要用user表循環(huán)10000次才能查詢出來妈嘹,而如果用class表驅(qū)動user表則只需要循環(huán)20次就能查詢出來
例:
select * from class c left join user u c.userid=u.userid
小結(jié)果集驅(qū)動大結(jié)果集
優(yōu)化的目標是盡可能減少JOIN中Nested Loop的循環(huán)次數(shù)
保證:永遠用小結(jié)果集驅(qū)動大結(jié)果集(Important)柳琢!
=========================總結(jié)===========================
1.開啟慢查詢?nèi)罩荆O(shè)置閥值润脸,比如超過5秒就是慢SQL,并把它抓取出來柬脸。
2.explain+慢SQL 分析
3.show profile 查詢SQL在MySQL服務(wù)器里面的執(zhí)行細節(jié)和聲明周期。
- SQL數(shù)據(jù)庫服務(wù)器的參數(shù)調(diào)優(yōu)津函。