網站首頁 編程語言 正文
分析查詢語句 Explain
-
table: 查詢的每一行記錄都對應著一個單表(有可能有臨時表,union去重)
-
id:在一個大的查詢語句中每個SELECT關鍵字都對應著一個唯一的id(查詢優化器可能對涉及及子查詢的語句進行重寫,轉變為多表查詢的操作)
a. id如果相同,可以認為是一組,從上往下順序執行
b. 在所有組中,id值越大,優先級越高,越先執行
c. 一個id號碼,表示一趟獨立的查詢,一個sql的查詢趟數越少越好 -
select_type: 對應那個查詢的類型,確定小查詢在整個大查詢中扮演了一個什么角色。
查詢語句中不包含union或者子查詢都是simple,連接查詢也是simple
union 最左邊的就是primary
后面的是union
會多一條臨時表,用來去重
子查詢:subquery,如果子查詢中用到的主查詢,就是dependent query
from中有select 就是派生表,derived -
partition:數據在哪個分區
-
type:訪問方法
- 當表中只有一條記錄,并且該表使用的存儲引擎統計數據是精確的。比如是myisam或者memory,那么對該表的訪問方法就是system
- 當我們根據主鍵或者唯一 二級索引與常數進行等值匹配時,對單表的訪問是const
- 在連接查詢的時候,如果被驅動表是通過主鍵或者唯一二級索引列等值匹配的方式進行訪問的。(如果該主鍵或者唯一二級索引是聯合索引的話,所有的索引列都必須是等值比較)。則對該被驅動表的訪問方式是eq_ref
- 當通過普通的二級索引列與常量進行等值匹配時來查詢某個表,那么對該表的訪問方法可能是ref(隱式轉換會導致索引失效)
- 當通過普通的二級索引列與常量進行等值匹配,該索引值也可以為NULL時,來查詢某個表,那么對該表的訪問方法可能是ref or null
- 單表訪問,在某些場景下可以使用union sort union 這幾種索引合并的方式來執行查詢,那么對該表的訪問方法可能是index_merge
- 如果索引獲取某些范圍區間的記錄,那么就可能使用到range訪問方法
- 當我們可以使用索引覆蓋,但需要掃描全部的索引記錄是,該表的訪問方法就是index
- 全表掃描 all
possible_keys/ keys
- possible_keys可能用到的索引
- keys 實際用到的索引
key_len
實際使用到的索引長度(字節數) 幫你檢查是否充分的利用上了索引,值越大越好,主要針對聯合索引
ref
當使用索引列等值查詢的時候,與索引列進行等值匹配的對象信息
- 常數類型const
- 某個列
- 某個函數
rows
預估的需要讀取的記錄條數(越小越好)
filtered
某個表經過搜索條件過濾后,剩余記錄 數的百分比。
索引失效
- 違反最左前綴原則
- 計算,函數,類型轉換(自動或者手動)會導致索引失效
- 范圍條件的右邊的列失效
- 不等于<> != 索引失效
- is null 可以使用索引,is not null 無法使用索引 not like 也同樣
- like 以通配符%開頭,索引失效(alibaba:sql查詢 嚴禁左模糊或全模糊)
- or前后出現非索引的列,索引失效,因為中間有一個沒有索引,還是得全表掃描
- 數據庫和表的字符集統一使用utf8mb4,一定要統一,如果轉換就會索引失效
建議
- 對于單列索引,盡量選擇針對當前query過旅行更好的索引
- 在選擇組合索引的時候,當前query中過濾性最好的字段,在索引字段順序中,位置越靠前越好
- 在選擇組合索引的時候,盡量選擇能夠包含當前query中的where子句中更多字段的索引
- 在選擇組合索引的時候,如果某個字段可能出現范圍查詢,盡量把這個字段放在索引次序的最后面。
- 總之盡量避免造成索引失效的情況
關聯查詢優化
- 左外連接
- 內連接
- 對于內連接來講,如果表的連接條件中,只有一個字段有索引,則有索引的字段會被作為被驅動表。
- 在兩個表的連接都存在索引的情況下,會選擇小表,作為驅動表(小表驅動大表)
原文鏈接:https://blog.csdn.net/weixin_42293662/article/details/125974893
相關推薦
- 2022-12-01 使用SDLocalize實現高效完成iOS多語言工作_IOS
- 2023-04-01 JQuery動態生成的按鈕無法觸發問題及完美解決方法_jquery
- 2022-07-13 Python字符串中如何去除數字之間的逗號_python
- 2022-05-12 android studio viewBinding 老爆紅
- 2022-02-04 SQL語句:空值判斷
- 2022-03-18 C++類和對象之封裝詳解_C 語言
- 2022-06-22 C語言單值二叉樹真題講解_C 語言
- 2022-11-05 Swift運算符使用方法淺析_Swift
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支