對於乙個sql語句,查詢優化器先看是不是能轉換成join,再將join進行優化
優化分為:
1. 條件優化
2.計算全表掃瞄成本
3. 找出所有能用到的索引
4. 針對每個索引計算不同的訪問方式的成本
5. 選出成本最小的索引以及訪問方式
開啟查詢優化器日誌
-- 開啟
set optimizer_trace="enabled=on";
-- 執行sql
-- 檢視日誌資訊
select * from information_schema.optimizer_trace;
-- 關閉
set optimizer_trace="enabled=off";
常量傳遞(constant_propagation)
a = 1 and b > a
上面這個sql可以轉換為:
a = 1 and b > 1
等值傳遞(equality_propagation)
a = b and b = c and c = 5
上面這個sql可以轉換為:
a = 5 and b = 5 and c = 5
移除沒用的條件(trivial_condition_removal)
a = 1 and 1 = 1
上面這個sql可以轉換為:
a = 1
基於成本
乙個查詢可以有不同的執行方案,可以選擇某個索引進行查詢,也可以選擇全表掃瞄,查詢優化器會選擇其中成本最低的方案去執行查詢。
i/o成本
innodb儲存引擎都是將資料和索引都儲存到磁碟上的,當我們想查詢表中的記錄時,需要先把資料或者索引載入到記憶體中然後再操作。這個從磁碟到記憶體這個載入的過程損耗的時間稱之為i/o成本。
innodb儲存引擎規定讀取乙個頁面花費的成本預設是1.0,讀取以及檢測一條記錄是否符合搜尋條件的成本預設是0.2。
基於成本的優化步驟
在一條單錶查詢語句真正執行之前,mysql的查詢優化器會找出執行該語句所有可能使用的方案,對比之後找出成本最低的方案,這個成本最低的方案就是所謂的執行計畫,之後才會呼叫儲存引擎提供的介面真正的執行查詢
下邊我們就以乙個例項來分析一下這些步驟,單錶查詢語句如下:
select * from employees.titles where emp_no > '10101' and emp_no < '20000' and to_date = '1991-10-10';
根據搜尋條件,找出所有可能使用的索引
emp_no > '10101',這個搜尋條件可以使用主鍵索引primary。
to_date = '1991-10-10',這個搜尋條件可以使用二級索引idx_titles_to_date。
------------恢復內容開始------------
對於乙個sql語句,查詢優化器先看是不是能轉換成join,再將join進行優化
優化分為:
1. 條件優化
2.計算全表掃瞄成本
3. 找出所有能用到的索引
4. 針對每個索引計算不同的訪問方式的成本
5. 選出成本最小的索引以及訪問方式
開啟查詢優化器日誌
-- 開啟
set optimizer_trace="enabled=on";
-- 執行sql
-- 檢視日誌資訊
select * from information_schema.optimizer_trace;
-- 關閉
set optimizer_trace="enabled=off";
常量傳遞(constant_propagation)
a = 1 and b > a
上面這個sql可以轉換為:
a = 1 and b > 1
等值傳遞(equality_propagation)
a = b and b = c and c = 5
上面這個sql可以轉換為:
a = 5 and b = 5 and c = 5
移除沒用的條件(trivial_condition_removal)
a = 1 and 1 = 1
上面這個sql可以轉換為:
a = 1
基於成本
乙個查詢可以有不同的執行方案,可以選擇某個索引進行查詢,也可以選擇全表掃瞄,查詢優化器會選擇其中成本最低的方案去執行查詢。
i/o成本
innodb儲存引擎都是將資料和索引都儲存到磁碟上的,當我們想查詢表中的記錄時,需要先把資料或者索引載入到記憶體中然後再操作。這個從磁碟到記憶體這個載入的過程損耗的時間稱之為i/o成本。
innodb儲存引擎規定讀取乙個頁面花費的成本預設是1.0,讀取以及檢測一條記錄是否符合搜尋條件的成本預設是0.2。
基於成本的優化步驟
在一條單錶查詢語句真正執行之前,mysql的查詢優化器會找出執行該語句所有可能使用的方案,對比之後找出成本最低的方案,這個成本最低的方案就是所謂的執行計畫,之後才會呼叫儲存引擎提供的介面真正的執行查詢
下邊我們就以乙個例項來分析一下這些步驟,單錶查詢語句如下:
select * from employees.titles where emp_no > '10101' and emp_no < '20000' and to_date = '1991-10-10';
根據搜尋條件,找出所有可能使用的索引
emp_no > '10101',這個搜尋條件可以使用主鍵索引primary。
to_date = '1991-10-10',這個搜尋條件可以使用二級索引idx_titles_to_date。
------------恢復內容結束------------
mysql 優化 聚集索引 mysql 索引優化
一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...
mysql索引優化原則 MySQL 索引優化原則
索引優化原則 1 最左字首匹配原則,聯合索引,mysql會從做向右匹配直到遇到範圍查詢 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以任意調整。2 和in可以亂序,比如a 1 and b 2 and c ...
mysql索引優化原則 MySQL索引優化
mysql官方對索引的定義 索引是幫助mysql高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如myisam和innodb儲存引擎只支援btree索引 memory和heap儲存引擎可以支援hash和btree索引。這裡僅針對常用的innodb儲存引擎所支援的b...