標籤:orderby group by city http 收藏 比較 where 技術 esc
最近一直在困擾的mysql join的工作原理問題,公司不推薦使用多表查詢,所以我探究一下join是怎麼工作的
答案是不是的!
收藏
也就是說連表查詢說order by group by的欄位必須是驅動表裡的。
我理解:left join左邊表就是驅動表,right join右邊表就是驅動表,inner join看explain 第一行為驅動表
背景:
users 表 866行資料 主鍵索引
user_city 35行資料 主鍵索引
1.explain select users.id from user_city left join users on users.id=user_city.`user_id`
驅動表user_city user_id沒有索引,users.id主鍵索引
2.explain select users.id from user_city left join users on users.id=user_city.`id`
驅動表user_city id是主鍵索引,users.id主鍵索引
3.explain select users.id from user_city left join users on users.user_id=user_city.`id`
驅動表user_city id是主鍵索引,users.user_id沒有索引
3.explain select users.id from user_city left join users on users.user_id=user_city.`id` where user_city.id<40
驅動表user_city id是主鍵索引,users.user_id沒有索引 where條件id索引
4.explain select users.id from user_city left join users on users.user_id=user_city.`id` where user_city.user_id<1700
驅動表user_city id是主鍵索引,users.user_id沒有索引 where條件user_id沒有索引
5.這兩個比較很重要,當連表排序的時候,orderby欄位除了必須是驅動表的欄位且有索引外,過濾條件on 也必須都使用到索引才可以,是都使用!
explain select users.id from user_city left join users on users.id=user_city.`id` order by users.id desc
都使用到了索引,但是orderby的不是驅動表的欄位,肯定會出現Using temporary; Using filesort
6.explain select users.id from user_city left join users on users.id=user_city.`id` order by user_city.id desc
都使用到了索引,orderby為驅動表欄位,不會出現Using temporary; Using filesort
7.explain select users.id from user_city left join users on users.user_id=user_city.`id` order by user_city.id desc
user_id沒有索引,即使orderby欄位為驅動表欄位
補充一點
一般能用join肯定用join,因為嗎、這樣的話mysql就會自己判斷選擇合適的驅動表了
關於mysql的join