通過explain關鍵字可以模擬優化器執行sql查詢,分析查詢語句或表結構的性能瓶頸。通過explain我們可以知道:
1、表的讀取順序
2、數據讀取操作的類型
3、哪些索引可以使用以及實際被使用的索引
4、表置鍵的引用
5、每張表有多少行被優化器查詢
通過實際案例來解釋explain的使用以及具體分析:
使用的方式很簡單,只需要在sql語句前面加上explain關鍵字,然后運行。
1、具體的字段代表的含義這里就不在贅述,請參考博文 https://blog.csdn.net/why15732625998/article/details/80388236
2、通過查詢結果顯示,三條語句都達到了ref級別,說明語句基本達標。但在Extra中顯示表a中顯示了Using temporary和Using filesort,這個就不nice了。
distinct的使用產生了Using temporary,但這個去重操作又是不可避免的;order by的使用產生了Using filesort,Using filesort表示在索引之外需要額外進行外部的排序動作,一般可以通過合適的索引來減少或者避免。參考博文 https://www.cnblogs.com/jikuanhao/p/11147391.html
3、語句中我注釋了查詢條件b.is_del=0,是因為該列中存在null值,而null會使索引失效。
4、如何查詢表索引:show keys from tablename 或 show index from tablename ,具體可見博文 https://blog.csdn.net/justry_deng/article/details/81458470
-------------------------我是分割線-----------------------------------------
一般不建議聯表查詢,很多高性能應用都會對關聯查詢進行分解,主要有如下優勢:
1、將查詢分解后,執行單個表查詢可以減少鎖的競爭。
2、一般高性能應用都會添加緩存機制,分解關聯查詢讓緩存的效率更高(關聯表時,若某個表發生變化,則整個緩存無法使用,但分表查詢只對變化的表查詢緩存有影響)。
3、在應用層做關聯,可以更容易對數據庫進行拆分,更容易做到高性能和可擴展。
4、查詢效率可能會有所提升,這要看具體的情況(單表in查詢按主鍵或索引順尋查詢比隨機關聯查詢效率高),其次我們知道mysql的單表查詢效率比聯表查詢效率更高。
5、可以減少冗余查詢。
6、有利於后期的分庫分表。
補充:explain extended select keys from table; show warnings;
-- 顯示當前語句可以優化的建議