mysql Using index condition


explain mysql 語句,在extra欄里出現  Using index condition 很好奇為什么呢? 是好還是不好?

首先 肯定答案: 是好的!

解釋:

     Using index condition  叫作    Index Condition Pushdown Optimization (索引下推優化)。

   Index Condition Pushdown (ICP)是MySQL使用索引從表中檢索行的一種優化。如果沒有ICP,存儲引擎將遍歷索引以定位表中的行,並將它們返回給MySQL服務器,服務器將判斷行的WHERE條件。在啟用ICP的情況下,如果可以只使用索引中的列來計算WHERE條件的一部分,MySQL服務器就會將WHERE條件的這一部分推到存儲引擎中。然后,存儲引擎通過使用索引條目來評估推入的索引條件,只有當滿足該條件時,才從表中讀取行。ICP可以減少存儲引擎必須訪問基表的次數和MySQL服務器必須訪問存儲引擎的次數。

  ICP的適用性取決於以下條件:

           1.當需要訪問整個表行時,ICP用於range、ref、eq_ref和ref_or_null訪問方法。
           2.ICP可以用於InnoDB和MyISAM表,包括分區的InnoDB和MyISAM表。
           3.對於InnoDB表,ICP僅用於二級索引。ICP的目標是減少全行讀取的數量,從而減少I/O操作。對於InnoDB聚集索引,完整的記錄已經被讀取到InnoDB緩沖區中。在這種情況下使用ICP並不會減少I/O。
           4.在虛擬生成的列上創建二級索引不支持ICP。InnoDB支持在虛擬生成的列上建立二級索引。   
           5.引用子查詢的條件不能下推。
           6.引用存儲函數的條件不能下推。存儲引擎無法調用存儲函數。
           7.觸發的條件不能被壓制。
 
     要理解 ICP 這種優化是如何工作的,首先考慮當沒有使用ICP時索引掃描是如何進行的:
          1.獲取下一行,首先通過讀取索引元組,然后使用索引元組定位和讀取整個表行。  
          2.檢查WHERE條件中應用於此表的部分。根據檢查結果接受或拒絕行。
     使用ICP,則會變成下面這樣:
          1.獲取下一行的索引元組(但不是整個表行)。  
          2.檢查應用於此表的WHERE條件的部分,僅使用索引列即可進行檢查。如果條件不滿足,則進入下一行的索引元組。(因為索引條件下推到了存儲引擎層)
          3.如果條件滿足,則使用index元組定位和讀取整個表行。
          4.測試應用於此表的WHERE條件的其余部分。根據測試結果接受或拒絕行
 
    例子:
        假設一個表包含關於人員及其地址的信息,並且該表有一個定義為index (zipcode, lastname, firstname)的索引。如果我們知道一個人的zipcode值,但不確定他的姓氏,我們可以這樣搜索:
            
SELECT * FROM people
  WHERE zipcode='95054'
  AND lastname LIKE '%etrunia%'
  AND address LIKE '%Main Street%';

  MySQL可以使用索引掃描郵編為'95054'的人。第二部分(lastname LIKE '%etrunia%')不能用於限制必須掃描的行數,因此如果沒有ICP,該查詢必須檢索zipcode='95054'的所有人的完整表行。使用ICP,MYSQL在讀取全部行表時,可以先檢查 

lastname LIKE '%etrunia%'  的部分,這樣避免了那部分多的數據的返回。

 

官方文檔解釋:https://dev.mysql.com/doc/refman/5.7/en/index-condition-pushdown-optimization.html

       
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM