1. 程式人生 > 資料庫 >MySQL 優化 —— Explain 執行計劃的理解

MySQL 優化 —— Explain 執行計劃的理解

引言

本部落格總結自MySQL 官網 Understanding the Query Execution Plan 專題。

根據我們的表、欄位、索引、以及 where 子句中的條件等資訊,MySQL 優化器會考慮各種技術來更高效地執行查詢。一個大表中的查詢不一定要讀取所有記錄;多表連線也不一定需要比較每條聯合記錄。優化器選擇的執行最優查詢的操作集,稱為“查詢執行計劃”,也可以說是 EXPLAIN 計劃。我們的目標就是找到那些可以將查詢優化地更好的點,然後通過學習 SQL 語法和索引等技術,來改善執行計劃。

一、什麼是 EXPLAIN ?

EXPLAIN 語句提供了 MySQL 如何執行語句的資訊:

1、EXPLAIN 可以和 SELECT DELETE INSERT REPLACE UPDATE 語句等一起工作;

2、當 EXPLAIN 和一個可被解釋的語句一起使用時,MySQL 就會展示來自優化器的關於語句執行計劃的資訊。即,MySQL 會解釋它將會怎樣執行語句,包括表是如何連線、以什麼方式排序等資訊。

3、When EXPLAIN is used with FOR CONNECTION connection_id  rather than an explainable statement,it displays the execution plan for the statement executing in the named connection.

4、對於 SELECT 語句, EXPLAIN 提供了額外的執行計劃資訊,可以用 SHOW WARNINGS 來檢視。

5、EXPLAIN對於檢查涉及分割槽表的查詢非常有用。

6、FORMAT 選項可以用於選擇輸出格式。TRADITIONAL 以表格的形式展示。如果沒有指定 FORMAT 選項,那麼TRADITIONAL 是預設的。JSON 格式會以 json 格式展示。

在 EXPLAIN 的幫助下,你可以清楚的知道為了讓查詢變得更快,該在哪裡給表新增索引。你也可以知道優化器是否以最佳的順序連線各個表。為了提示優化器使用與SELECT語句中表的命名順序相對應的連線順序,請以SELECT STRAIGHT_JOIN(而不是SELECT)開始該語句。However,STRAIGHT_JOIN

 may prevent indexes from being used because it disables semijoin transformations

優化器跟蹤有時可能提供與EXPLAIN互補的資訊。但是,優化器跟蹤格式和內容可能在版本之間發生變化。

如果你對本應該使用索引而沒有用到索引的情況感到疑惑,執行一下 ANALYZE TABLE 來更新表統計資訊。例如鍵的基數,這會影響優化器所做的選擇。

注意:

EXPLAIN 還可以用來獲取表中列的資訊。 EXPLAIN 表名DESCRIBE 表名 SHOW CLOUMS FROM 表名 是等價的。

(未完待續。。。。)