8.2.1.3 Range Optimization
生活随笔
收集整理的這篇文章主要介紹了
8.2.1.3 Range Optimization
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
8.2.1.3 Range Optimization 范圍訪問方法使用一個單個的索引來檢索表記錄的自己,包含在一個或者索引值區間。它可以用于一個單獨的部分或者多個部分的索引,下面章節給出了一個詳細的描述關于如何從WHERE 子句中提取區間8.2.1.3.1 范圍訪問方法用于單部分索引對于一個單部分索引,索引值區間可以方便的體現通過相應的條件在WHERE子句,表示為范圍條件,而不是"間隔"單個range 條件定義對于一個單部分索引如下:1. 對于BTREE和HASH 索引,key和恒定值比較是一個范圍條件 當使用=,<=> in ,is NULL或者IS NOT NULL操作此外, 對于BTREE 索引, key和常值比較是一個條件當使用e >, <, >=, <=, BETWEEN, !=, or <>操作或者LIKE 比較如果參數to like 是一個常量 不是以一個通配符開始對于所有index type, 多個range 條件集合OR或者AND 為一個range 條件常量值在前面的描述意味著下面:1.從查詢字符串中的常量2.一個常量或者系統表的列從相同關聯3.一個無關聯子查詢結果4.任何表達式組成整個從之前類型的子表達式這里有一些查詢例子使用范圍掃描在WHERE 子句:SELECT * FROM t1WHERE key_col > 1AND key_col < 10;SELECT * FROM t1WHERE key_col = 1OR key_col IN (15,18,20);SELECT * FROM t1WHERE key_col LIKE 'ab%'OR key_col BETWEEN 'bar' AND 'foo';一些非常量值可以被轉換成常量在優化器常量傳播階段MySQL 嘗試提取范圍條件從WHERE 子句對于每個可能的indexes.在提取過程中,條件不能被用于構造范圍條件會被drop掉,條件產生重疊范圍會被合并,條件產生空的范圍會被刪除考慮下面的語句,key1 是一個索引列,nonkey 沒有被索引SELECT * FROM t1 WHERE(key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR(key1 < 'bar' AND nonkey = 4) OR(key1 < 'uux' AND key1 > 'z');對于key1的提取過程:1.從原始的WHERE 子句開始:(key1 < 'abc' AND (key1 LIKE 'abcde%' OR key1 LIKE '%b')) OR
(key1 < 'bar' AND nonkey = 4) OR
(key1 < 'uux' AND key1 > 'z')2. 刪除nokey=4 和key1 LIKE '%b' 因為它們不能被用于一個范圍掃描。正確的方式是去掉它們替換它們使用TRUE,因為我們不會丟失任何匹配的行當做一個范圍掃描的時候,替換它們使用TRUE,我們得到:(key1 < 'abc' AND (key1 LIKE 'abcde%' OR TRUE)) OR
(key1 < 'bar' AND TRUE) OR
(key1 < 'uux' AND key1 > 'z')3.折疊的條件總是真的或者假的:(key1 LIKE 'abcde%' OR TRUE) is always true(key1 < 'uux' AND key1 > 'z') is always false替換不必要的TRUE和FALSE常量,我們得到:(key1 < 'abc') OR (key1 < 'bar')通常(和前面的例子所證明的),條件用于一個范圍掃描是很少限制的相比WHERE 子句MySQL 執行一個額外的檢查來過濾出記錄 來滿足范圍條件但是不能完整的WHERE 子句范圍條件提取算法可以處理 netsted and/or 隨意深度的結構, 它的輸出不依賴條件出現在WHERE 子句的順序MySQL 不支持 合并多個range 對于range 訪問方法,要解決這個限制,你可以使用一個UNION 相同的SQL語句,除非你放置每個謂詞在不同的SELECT 語句8.2.1.3.2 范圍訪問方法用于多部分索引:Range 條件在一個多部分多音是一個rang 條件的擴展,一個range 條件在多部分索引限制索引記錄位于一個或者多個key tuple 區間。Key 區間是定義通過key 的集合例如,考慮一個多部分索引定義為key1(key_part1, key_part2, key_part3)key_part1 key_part2 key_part3NULL 1 'abc'NULL 1 'xyz'NULL 2 'foo'1 1 'abc'1 1 'xyz'1 2 'abc'2 1 'aaa'條件 key_part1 =1 定義這個區間:(1,-inf,-inf) <= (key_part1,key_part2,key_part3) < (1,+inf,+inf)對于B樹索引,一個區間可能是用于條件集合AND,每個條件比較一個Key和一個常值 使用=, <=>, IS NULL, >, <, >=, <=, !=, <>, BETWEEN, or LIKE 'pattern' (模式不是以一個通配符開始的)一個區間可以用于確定一個單獨的key 包含所有的記錄,匹配條件(或者2個區間 如果 <> or != 被使用)優化嘗試使用額外的索引部分來決定區間只要比較表達式 是 =, <=>, or IS NULL. I如果 操作符是>, <, >=, <=, !=, <>, BETWEEN, or LIKE,優化器使用它不考慮更多的key如果下面的表達式,優化器使用=從第一個比較,它也使用>=從第2個比較表達式 但是不在考慮索引部分key_part1 = 'foo' AND key_part2 >= 10 AND key_part3 > 10多只比較 平等范圍優化:考慮表達式,col_names 是一個索引的列:col_name IN(val1, ..., valN)col_name = val1 OR ... OR col_name = valN如果col_name 是等于任何幾個值中的一個 ,那么每個表達式是真的。那些表達式是等于范圍比較(range 是一個單獨的值)優化器評估 讀取符合記錄的成本對于平等范圍比較如下:如果有一個唯一的索引在col_name,row 評估每個range 是1 因為最多一個記錄可以有給定的值否則,任何Index 在col_name 是非唯一的,優化器可以評估記錄數對于每個range 使用
轉載于:https://www.cnblogs.com/zhaoyangjian724/p/6199154.html
總結
以上是生活随笔為你收集整理的8.2.1.3 Range Optimization的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .windbg-k*实例分析(查看调用栈
- 下一篇: pthread_once()