MySQL Index Condition Pushdown(ICP)的使用限制
ICP(index condition pushdown)是mysql利用索引(二級索引)元組和篩欄位在索引中的where條件從表中提取資料記錄的一種最佳化操作。ICP的思想是:儲存引擎在訪問索引的時候檢查篩選欄位在索引中的where條件(pushed index condition,推送的索引條件),如果索引元組中的資料不滿足推送的索引條件,那麼就過濾掉該條資料記錄。ICP(最佳化器)儘可能的把index condition的處理從server層下推到storage engine層。storage engine使用索引過過濾不相關的資料,僅返回符合index condition條件的資料給server層。也是說資料過濾儘可能在storage engine層進行,而不是返回所有資料給server層,然後後再根據where條件進行過濾。
Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一種在儲存引擎層使用索引過濾資料的一種最佳化方式。
a 當關閉ICP時,index 僅僅是data access 的一種訪問方式,儲存引擎透過索引回表獲取的資料會傳遞到MySQL Server 層進行where條件過濾。
b 當開啟ICP時,如果部分where條件能使用索引中的欄位,MySQL Server 會把這部分下推到引擎層,可以利用index過濾的where條件在儲存引擎層進行資料過濾,而非將所有透過index access的結果傳遞到MySQL server層進行where過濾.
最佳化效果:ICP能減少引擎層訪問基表的次數和MySQL Server 訪問儲存引擎的次數,減少io次數,提高查詢語句效能。
ICP 開啟時 ,MySQL將在儲存引擎層 利用索引過濾資料,減少不必要的回表,注意 虛線的using where 表示如果where條件中含有沒有被索引的欄位,則還是要經過MySQL Server 層過濾。
ICP的使用限制:
1 當sql需要全表訪問時,ICP的最佳化策略可用於range, ref, eq_ref, ref_or_null 型別的訪問資料方法 。
2 支援InnoDB和MyISAM表。
3 ICP只能用於二級索引,不能用於主索引。
4 並非全部where條件都可以用ICP篩選。
如果where條件的欄位不在索引列中,還是要讀取整表的記錄到server端做where過濾。
5 ICP的加速效果取決於在儲存引擎內透過ICP篩選掉的資料的比例。
6 5.6 版本的不支援分表的ICP 功能,5.7 版本的開始支援。
7 當sql 使用覆蓋索引時,不支援ICP 最佳化方法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2221758/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20230908]Oracle Index Range Scan with LIKE Condition on Wildcard '_'.txtOracleIndex
- mysql中雜湊索引的使用限制MySql索引
- MySQL MRR和ICP介紹MySql
- MySQL:關於ICP特性的說明(未完)MySql
- mariadb 分割槽表 不能使用 ICP
- MySQL中為什麼要使用索引合併(Index Merge)?MySql索引Index
- condition的作用
- mysql 函式substring_index()MySql函式Index
- 【MySQL】Merge Index導致死鎖MySqlIndex
- MySQL 索引覆蓋(Covering Index)MySql索引Index
- 簡單談談MySQL的loose index scanMySqlIndex
- mysql 8.0.11 資料庫使用者密碼修改詭異的限制MySql資料庫密碼
- 【mysql】SUBSTRING_INDEX 用法舉例MySqlIndex
- 同步控制和鎖,ReenterLock和Condition的詳細使用
- MySQL 中 一條 order by index limit 語句的分析MySqlIndexMIT
- MySQL explain結果Extra中"Using Index"與"Using where; Using index"區別MySqlAIIndex
- MySQL組複製的要求和限制歸納MySql
- MySQL的欄位數量以及長度限制MySql
- 使用 Proxy 突破網管的限制
- MySQL whereIn 有最大限制嗎?MySql
- MySQL 8.0新特性-倒敘索引 desc indexMySql索引Index
- 多執行緒中使用Lock鎖定多個條件Condition的使用執行緒
- ICP證和EDI證的區別
- 新特性解讀 | MySQL 8.0.28 使用者連線記憶體限制MySql記憶體
- Laravel API 速率限制器的使用LaravelAPI
- MySQl 擷取函式 left(),right(),substring(),substring_index() 的用法MySql函式Index
- What is the difference between Mysql InnoDB B+ tree index and hash index? Why does MongoDB use B-tree?MySqlIndexMongoDB
- MySQL 優化之 index_merge (索引合併)MySql優化Index索引
- MySQL SQL最佳化 - 覆蓋索引(covering index)MySql索引Index
- mysql 的delete from where 子查詢的一些限制MySqldelete
- oracle invisible index與unusable index的區別OracleIndex
- ICP備案底部程式碼
- ICP備案掃盲帖
- PCL之ICP演算法演算法
- icp配準進度條
- 辦理ICP許可證
- Java併發——ConditionJava
- 06 ReentrantLock之ConditionReentrantLock