mysql 索引優化器 Mysql之查詢優化器

2021-10-18 21:03:46 字數 2823 閱讀 2062

對於乙個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...