中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是MySQL索引下推

發布時間:2021-10-09 15:43:07 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

本篇內容主要講解“什么是MySQL索引下推”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“什么是MySQL索引下推”吧!

目錄
  • 1、最左前綴原則

  • 2、回表

  • 3、索引下推

前言:

索引下推(ICP)是針對MySQL使用索引從表中檢索數據行的情況的優

  • 在沒有索引下推的情況下,MySQL通過存儲引擎遍歷索引來定位表中的數據行并將它們返回給MySQl服務器,服務器再進行WHERE條件的判斷,確認是否將數據行加入結果集。

  • 開啟索引下推,且WHERE條件部分可以僅使用索引中的列來評估,這時MySQL服務器會將這部分WHERE條件下推到存儲引擎,接著存儲引擎使用索引條目評估推送的索引條件,僅當滿足該條件時才從表中進行讀取

索引下推可以減少存儲引擎訪問數據表的次數以及MySQL服務器訪問存儲引擎的次數。

是不是還有點懵呢,那就對了,毫無疑問上面這段話理解起來相當費勁,但請不要灰心,我將用最通俗易懂的語言來帶你了解索引下推。

總結一下:

  • 最左前綴原則

  • 回表

1、最左前綴原則

??MySQL在建立聯合索引時會遵循最左前綴原則,比如現在User表建立了聯合索引(id,name,age)根據最左前綴原則只有在SQL的條件部分命中(id)、(id,name)或者(id, name, age)時才能使用到這個聯合索引。

能使用該索引的情況如下:

SELECT * FROM USER WHERE id = 1

SELECT * FROM USER WHERE id = 1 and name = 'zhangsan'

SELECT * FROM USER WHERE id = 1 and name = 'zhangsan' and age = 18

不能使用該索引的情況如下:

SELECT * FROM USER WHERE name = 'zhangsan'

SELECT * FROM USER WHERE age = 18

SELECT * FROM USER WHERE name = 'zhangsan' and age = 18

對于聯合索引mysql會一直向右匹配直到遇到范圍查詢(>、<、betweenlike)就停止匹配。

2、回表

MySQLInnoDB引擎下支持兩種索引

  • 聚集索引 :索引里(B+樹的葉子結點上)存儲的是數據行(真實的數據)

  • 普通索引 :索引里(B+樹的葉子結點上)存儲的是主鍵

這里著重說一下聚集索引,官方文檔有以下描述

  • 在有主鍵的表,InnoDB將主鍵作為聚集索引

  • 沒有主鍵的表,InnoDB使用第一個唯一索引作為聚集索引

  • 即沒有主鍵也沒有唯一索引時,MySQL將生成一個隱藏的6字節大小的row ID字段作為聚集索引

??MySQL通過普通索引沒法一次性將數據拿全的情況下,通過普通索引獲取主鍵值,再通過主鍵值到聚集索引中定位到記錄,這個過程就叫回表。可以通過建立覆蓋索引來減少回表,比如現在要通過身份證號查姓名,那就建立身份證號和姓名的聯合索引(idname),當查詢時可以通過這個索引直接拿到姓名name得值,不再需要去聚集索引里查找了,這就是覆蓋索引。

3、索引下推

首先創建一個用戶表

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255)  DEFAULT NULL,
  `age` int  DEFAULT 0,
  `class` varchar(255)  DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_two` (`name`,`age`)
) ENGINE=InnoDB;

//這張表增加一個復合索引
 (`name`,`age`)

給表插入數據

INSERT INTO  `student` (`name`, `age`, `class`) VALUES  ('pengpeng', 21, '1');
INSERT INTO  `student` (`name`, `age`, `class`) VALUES  ('pengpeng', 22, '2');
INSERT INTO  `student` (`name`, `age`, `class`) VALUES  ('pengpeng', 23, '3');
INSERT INTO  `student` (`name`, `age`, `class`) VALUES  ('pengpeng', 24, '4');
INSERT INTO  `student` (`name`, `age`, `class`) VALUES  ('pengpeng', 25, '5');

查詢插入的數據如下

什么是MySQL索引下推

接下來explain下面這個SQL

explain select * from student where name like 'peng%' and age = 23;

什么是MySQL索引下推

可以看到Extra字段顯示為USING INDEX CONDITION,這就表明這個SQL使用了索引下推,我們分析下上面這個SQL語句:

在MySQL5.6之前,只能從name字段中找出符合條件的行然后開始回表,到聚集索引上找出數據行,再對age字段進行對比,把符合條件的數據加入到結果集中。

在MySQL5.6引入了索引下推優化,在索引的遍歷過程中,對索引中包含字段先做判斷,這里對age字段進行判斷。直接將age字段不滿足的數據行排除,從而減少回表的次數。

問答區

問題1 當復合索引列為(name,age,address)時 以下SQL能使用索引嗎?

select * from student where name like 'peng%' and age = 23;

??可以,遇到like會中斷后續元素的匹配,但只能使用name這個字段,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配。范圍列可以用到索引,但是范圍列后面的列無法用到索引。即索引最多用于一個范圍列,因此如果查詢條件中有兩個范圍列則無法全用到索引。

問題2 索引下推只能存在聯合索引里嗎?

是的,非聯合索引無法使用索引下推。

問題3 索引下推在哪些情況下無法使用?

下推條件遇到子查詢

下推條件遇到函數

非InnoDB表和MyISAM表

問題4 索引下推如何開啟和關閉?

// 索引下推默認是開啟的
set optimizer_switch='index_condition_pushdown=off'; // 關閉
set optimizer_switch='index_condition_pushdown=on'; // 開啟

到此,相信大家對“什么是MySQL索引下推”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新丰县| 盐城市| 策勒县| 徐水县| 桐柏县| 罗平县| 安西县| 漯河市| 四平市| 武鸣县| 沁源县| 景德镇市| 苍南县| 宁强县| 樟树市| 屏山县| 屏边| 平顺县| 海伦市| 光泽县| 新昌县| 江北区| 勐海县| 灌云县| 兖州市| 蒙城县| 尼勒克县| 沙田区| 乡城县| 武穴市| 巴林右旗| 遂昌县| 安国市| 财经| 沈丘县| 东城区| 宁南县| 宁武县| 莆田市| 东方市| 本溪|