mysql + left join
一、mysql left join 的原則上有兩點
1、左表為小表
2、右表的關聯欄位是索引
(無視以上兩點,一般不要用left join~~! )
遇到的問題:右表(c)是大表,分別 有兩個小表(a和b)
當 a left join c 的時候可以使用上c的關聯欄位索引,
但是b left join c 的時候無法使用上索引,全文搜尋了,
兩個小表的結構表面看起來一樣,後面使用 show full columns from [tables]
發現不能使用索引的 b,c 表的 關聯欄位字符集 不一樣
二、left join 情況下 使用 order by 排序
mysql在多個left join的情況下使用order by排序,就算是其中一個表的主鍵也仍然使用file sort排序,資料量多的話就相當的慢。
優化前語句
select * from a left join b on a.id=b.a_id order a.id desc
優化後語句
select * from a left join b on a.id=b.a_id join (select id from a order by id desc) a_order on a.id = a_order.id
實際工作中100W+的幾個表使用LEFT JOIN要20分鐘才能得到結果,語句優化後3秒。
三、索引失效的部分總結
1、對單欄位建了索引,where條件多欄位。
例:建了以下索引:
查詢語句:
select * from template t where t.logicdb_id = 4 and t.sync_status = 1
2、建立聯合索引,where條件單欄位。與上面情況正好相反。
例:建了以下索引:
查詢語句:
select * from template t where t.sync_status = 4
3、對索引列運算,運算包括(+、-、*、/、!、<>、%、like'%_'(%放在前面)、or、in、exist等),導致索引失效。
4、型別錯誤,如欄位型別為varchar,where條件用number。
例:template_id欄位是varchar型別。
錯誤寫法:select * from template t where t.template_id = 1
正確寫法:select * from template t where t.template_id = '1'
5、對索引應用內部函式,這種情況下應該建立基於函式的索引。
例:select * from template t where ROUND(t.logicdb_id) = 1
此時應該建ROUND(t.logicdb_id)為索引。
6、查詢表的效率要比應用索引查詢快的時候。
7、is null 索引失效;is not null Betree索引生效。導致的原因,個人認為應該是,mysql沒有在null寫進索引。還要看應用的資料庫而定。
四、mysql犧牲了group by來增加left join的速度(前提是加了索引)。
相關文章
- mysql left join轉inner joinMySql
- MySQL LEFT JOIN/ INNER JOIN/RIGHT JOINMySql
- 【MySQL】LEFT JOIN 踩坑MySql
- MySQL 之 LEFT JOIN 避坑指南MySql
- mysql left join 優化學習MySql優化
- MYSQL 怎麼 LEFT JOIN 多表聯查MySql
- mysql中的left join、right join 、inner join的詳細用法MySql
- MYSQL count標量子查詢改left joinMySql
- MySql的join(連線)查詢 (三表 left join 寫法)MySql
- SQL Server Left joinSQLServer
- LEFT JOIN 和JOIN 多表連線
- sql:left join和join區別SQL
- sql中的join、left join、right joinSQL
- 深入理解mysql之left join 使用詳解MySql
- join、inner join、left join、right join、outer join的區別
- mysql的left join和inner join的效率對比,以及如何優化MySql優化
- mysql常用連線查詢join,left,right,crossMySqlROS
- Mysql-left join on後接and,和where的區別MySql
- sql left join 和 right join解釋SQL
- sql之left join、right join、inner join的區別SQL
- 連線查詢簡析 join 、 left join 、 right join
- mysql INNER JOIN、LEFT JOIN、RIGHT JOIN;內連線(等值連線)、左連線、右連線MySql
- oracle update left join查詢Oracle
- Oracle Left join right jionOracle
- sql server left join問題SQLServer
- Inner Join, Left Outer Join和Association的區別
- SQL中聯表查詢操作(LEFT JOIN, RIGHT JOIN, INNER JOIN)SQL
- Oracle -- left join 什麼情況可以直接改成joinOracle
- sql的left join 、right join 、inner join之間的區別SQL
- sql的left join 命令詳解SQL
- left join,right join,inner join的條件on和where的區別
- LEFT JOIN 需要注意的點(Presto)REST
- mysql中多個left join子查詢寫法以及別名用法MySql
- 用LEFT JOIN優化標量子查詢優化
- oracle的left join,right join和full join的一點介紹(R1)Oracle
- MySQL筆記-左連線的使用(left join有關聯的多表查詢)MySql筆記
- 一個left join SQL 簡單優化分析SQL優化
- 三表關聯查詢-多次LEFT JOIN...ON