91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

left?join沒有走索引的原因是什么及怎么解決

發布時間:2023-05-11 16:21:49 來源:億速云 閱讀:363 作者:iii 欄目:開發技術

本篇內容主要講解“left join沒有走索引的原因是什么及怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“left join沒有走索引的原因是什么及怎么解決”吧!

查一次left join沒有走索引的原因

線上有個查詢sql,原來是inner join 查詢沒有問題,后來應業務要求改成left join之后, 查詢時間就暴漲了 需要長達24s

left?join沒有走索引的原因是什么及怎么解決

通過explain分析,發現訂單表沒有走索引 ,分析之后解決了,記錄下來。

為了簡潔起見,這里就將無關的查詢字段都用*

具體sql如下

SELECT  * 
 from t_item_detail a
 left join t_order_detail d on a.order_code=d.order_code
 left join t_connection b on a.unique_code = b.funds_unique 
 left join t_capital_detail c on b.capital_unique = c.unique_code 
 where item_receipt_disbursement=1 and a.is_deleted=0
  and order_type_code=00901 group by a.unique_code LIMIT 10

用explain命令分析如下

left?join沒有走索引的原因是什么及怎么解決

發現table d 的type為all, rows居然高達20萬行 。

d對應的表為order_detail 表,type為all 說明并沒有走索引。

這里首先看關聯條件

from t_item_detail a
 left join t_order_detail d on a.order_code=d.order_code

該條件并無問題,然后這兩張表的order_code字段是否加索引.

left?join沒有走索引的原因是什么及怎么解決

left?join沒有走索引的原因是什么及怎么解決

兩張表的order_code字段均有索引。

其次再看, 如果兩個字段或者兩張表的編碼不同,也會導致索引失效。

但是這兩張表的編碼和字段編碼也均相同,因此也排除掉。

最后發現,

如果寫成

 explain SELECT  * 
 from t_item_detail a
 left join t_order_detail d on a.order_code=d.order_code  and d.order_type_code=00901
 left join t_connection b on a.unique_code = b.funds_unique 
 left join t_capital_detail c on b.capital_unique = c.unique_code 
 where item_receipt_disbursement=1 and a.is_deleted=0
  group by a.unique_code LIMIT 10

也就是將原來在where條件的order_type_code=00901 寫到left join的條件后面

left?join沒有走索引的原因是什么及怎么解決

d的索引就生效了,所有的索引都生效了。

查詢時間也從原來的24秒 變成了不到1秒。

left?join沒有走索引的原因是什么及怎么解決

這是為什么呢?

其實問題就出在這個 d.order_type_code=00901 這個條件上

當有這個條件時候

left?join沒有走索引的原因是什么及怎么解決

全文掃描

沒有這個條件的時候

left?join沒有走索引的原因是什么及怎么解決

從sql的執行順序來分析:

SELECT  * 
 from t_item_detail a
 left join t_order_detail d on a.order_code=d.order_code
 left join t_connection b on a.unique_code = b.funds_unique 
 left join t_capital_detail c on b.capital_unique = c.unique_code 
 where item_receipt_disbursement=1 and a.is_deleted=0
  and order_type_code=00901 group by a.unique_code LIMIT 10

這里面的執行順序為

  • 1.from

  • 2.on

  • 3.join

  • 4.where

  • 5.select

  • 6.group by

  • 7.limit

寫的順序:select … from… where… group by… having… order by… limit [offset,](rows)

執行順序:from… where…group by… having… select … order by… limit

知道這個,我們再看這個sql

不走索引 有order_type_code條件

SELECT *
from t_item_detail a
left join t_order_detail d on a.order_code=d.order_code
left join t_connection b on a.unique_code = b.funds_unique
left join t_capital_detail c on b.capital_unique = c.unique_code
where item_receipt_disbursement=1 and a.is_deleted=0
and order_type_code=00901 group by a.unique_code LIMIT 10

走索引 沒有order_type_code條件

SELECT *
from t_item_detail a
left join t_order_detail d on a.order_code=d.order_code
left join t_connection b on a.unique_code = b.funds_unique
left join t_capital_detail c on b.capital_unique = c.unique_code
where item_receipt_disbursement=1 and a.is_deleted=0
group by a.unique_code LIMIT 10

和走索引有沒有order_type_code條件

SELECT *
from t_item_detail a
left join t_order_detail d on a.order_code=d.order_code and d.order_type_cod=‘00901'
left join t_connection b on a.unique_code = b.funds_unique
left join t_capital_detail c on b.capital_unique = c.unique_code
where item_receipt_disbursement=1 and a.is_deleted=0
group by a.unique_code LIMIT 10

會發現 在不走索引有order_type_code條件的那個sql中, 在執行到where的時候,需要去找到條件 order_type_code=00901 ,但是order_type_code這個字段沒有索引,所以數據庫就去對order_detail進行全表掃描。

因此解決方案

就是給order_type_code加上索引,或者給 left join on就加上條件order_type_code=xxx ,直接過濾掉

因此,謹記,大表查詢的時候,where 的條件千萬記得加上索引!!!!

到此,相信大家對“left join沒有走索引的原因是什么及怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

旬阳县| 巴林右旗| 偏关县| 沁阳市| 舒城县| 大安市| 日土县| 忻城县| 慈利县| 吉林省| 祁连县| 六安市| 板桥市| 武汉市| 麻阳| 抚顺市| 黔西| 金寨县| 安岳县| 滦平县| 枝江市| 桑植县| 威信县| 镇沅| 隆林| 岚皋县| 达日县| 甘泉县| 应用必备| 永和县| 齐齐哈尔市| 鄂尔多斯市| 临沭县| 越西县| 台前县| 长沙县| 吉安县| 阜城县| 潮州市| 邯郸市| 民丰县|