最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL索引下推詳細(xì)

 更新時(shí)間:2021年10月09日 14:13:40   作者:程序員巴士  
這篇文章主要介紹MySQL索引下推,索引下推(ICP)是針對(duì)MySQL使用索引從表中檢索數(shù)據(jù)行的情況的優(yōu)化。下面就來(lái)介紹相關(guān)資料,需要的朋友可以參考一下

前言:

索引下推(ICP)是針對(duì)MySQL使用索引從表中檢索數(shù)據(jù)行的情況的優(yōu)

  • 在沒(méi)有索引下推的情況下,MySQL通過(guò)存儲(chǔ)引擎遍歷索引來(lái)定位表中的數(shù)據(jù)行并將它們返回給MySQl服務(wù)器,服務(wù)器再進(jìn)行WHERE條件的判斷,確認(rèn)是否將數(shù)據(jù)行加入結(jié)果集。
  • 開(kāi)啟索引下推,且WHERE條件部分可以僅使用索引中的列來(lái)評(píng)估,這時(shí)MySQL服務(wù)器會(huì)將這部分WHERE條件下推到存儲(chǔ)引擎,接著存儲(chǔ)引擎使用索引條目評(píng)估推送的索引條件,僅當(dāng)滿足該條件時(shí)才從表中進(jìn)行讀取

索引下推可以減少存儲(chǔ)引擎訪問(wèn)數(shù)據(jù)表的次數(shù)以及MySQL服務(wù)器訪問(wèn)存儲(chǔ)引擎的次數(shù)。

是不是還有點(diǎn)懵呢,那就對(duì)了,毫無(wú)疑問(wèn)上面這段話理解起來(lái)相當(dāng)費(fèi)勁,但請(qǐng)不要灰心,我將用最通俗易懂的語(yǔ)言來(lái)帶你了解索引下推。

總結(jié)一下:

  • 最左前綴原則
  • 回表

1、最左前綴原則

  MySQL在建立聯(lián)合索引時(shí)會(huì)遵循最左前綴原則,比如現(xiàn)在User表建立了聯(lián)合索引(id,name,age)根據(jù)最左前綴原則只有在SQL的條件部分命中(id)、(id,name)或者(id, name, age)時(shí)才能使用到這個(gè)聯(lián)合索引。

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

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

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

2、回表

MySQLInnoDB引擎下支持兩種索引

  • 聚集索引 :索引里(B+樹(shù)的葉子結(jié)點(diǎn)上)存儲(chǔ)的是數(shù)據(jù)行(真實(shí)的數(shù)據(jù))
  • 普通索引 :索引里(B+樹(shù)的葉子結(jié)點(diǎn)上)存儲(chǔ)的是主鍵

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

  • 在有主鍵的表,InnoDB將主鍵作為聚集索引
  • 沒(méi)有主鍵的表,InnoDB使用第一個(gè)唯一索引作為聚集索引
  • 即沒(méi)有主鍵也沒(méi)有唯一索引時(shí),MySQL將生成一個(gè)隱藏的6字節(jié)大小的row ID字段作為聚集索引

  MySQL通過(guò)普通索引沒(méi)法一次性將數(shù)據(jù)拿全的情況下,通過(guò)普通索引獲取主鍵值,再通過(guò)主鍵值到聚集索引中定位到記錄,這個(gè)過(guò)程就叫回表。可以通過(guò)建立覆蓋索引來(lái)減少回表,比如現(xiàn)在要通過(guò)身份證號(hào)查姓名,那就建立身份證號(hào)和姓名的聯(lián)合索引(id,name),當(dāng)查詢時(shí)可以通過(guò)這個(gè)索引直接拿到姓名name得值,不再需要去聚集索引里查找了,這就是覆蓋索引。

3、索引下推

首先創(chuàng)建一個(gè)用戶表

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;

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

給表插入數(shù)據(jù)

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');


查詢插入的數(shù)據(jù)如下

接下來(lái)explain下面這個(gè)SQL

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


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

在MySQL5.6之前,只能從name字段中找出符合條件的行然后開(kāi)始回表,到聚集索引上找出數(shù)據(jù)行,再對(duì)age字段進(jìn)行對(duì)比,把符合條件的數(shù)據(jù)加入到結(jié)果集中。

在MySQL5.6引入了索引下推優(yōu)化,在索引的遍歷過(guò)程中,對(duì)索引中包含字段先做判斷,這里對(duì)age字段進(jìn)行判斷。直接將age字段不滿足的數(shù)據(jù)行排除,從而減少回表的次數(shù)。

問(wèn)答區(qū)

問(wèn)題1 當(dāng)復(fù)合索引列為(name,age,address)時(shí) 以下SQL能使用索引嗎?

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


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

問(wèn)題2 索引下推只能存在聯(lián)合索引里嗎?

是的,非聯(lián)合索引無(wú)法使用索引下推。

問(wèn)題3 索引下推在哪些情況下無(wú)法使用?

下推條件遇到子查詢

下推條件遇到函數(shù)

非InnoDB表和MyISAM表

問(wèn)題4 索引下推如何開(kāi)啟和關(guān)閉?

// 索引下推默認(rèn)是開(kāi)啟的
set optimizer_switch='index_condition_pushdown=off'; // 關(guān)閉
set optimizer_switch='index_condition_pushdown=on'; // 開(kāi)啟

總結(jié)

  索引下推在非主鍵索引上的優(yōu)化,可以有效減少回表的次數(shù),大大提升了查詢的效率,在平時(shí)工作中可以根據(jù)業(yè)務(wù)情況通過(guò)優(yōu)化索引來(lái)達(dá)到使用索引下推,提高業(yè)務(wù)吞吐量。

到此這篇關(guān)于MySQL索引下推詳細(xì)的文章就介紹到這了,更多相關(guān)MySQL索引下推內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Centos下安裝多個(gè)mysql數(shù)據(jù)庫(kù)的配置實(shí)例詳解

    Centos下安裝多個(gè)mysql數(shù)據(jù)庫(kù)的配置實(shí)例詳解

    在實(shí)際的開(kāi)發(fā)和運(yùn)維場(chǎng)景中,有時(shí)我們需要在同一臺(tái)服務(wù)器上運(yùn)行多個(gè)MySQL數(shù)據(jù)庫(kù)實(shí)例,本文將詳細(xì)介紹如何在CentOS系統(tǒng)中安裝并配置多個(gè)MySQL數(shù)據(jù)庫(kù)實(shí)例,希望對(duì)大家有所幫助
    2025-04-04
  • MySQL函數(shù)之字符串函數(shù)解讀

    MySQL函數(shù)之字符串函數(shù)解讀

    MySQL提供了多種字符串函數(shù),如CONCAT、CONCAT_WS、LENGTH、CHAR_LENGTH、LEFT、RIGHT、REPLACE、SUBSTRING、TRIM、FIND_IN_SET和FORMAT,用于處理數(shù)據(jù)庫(kù)中的字符串?dāng)?shù)據(jù)
    2024-12-12
  • 手把手教你使用Navicat生成MySQL測(cè)試數(shù)據(jù)

    手把手教你使用Navicat生成MySQL測(cè)試數(shù)據(jù)

    Navicat是一套快速、可靠并價(jià)格相當(dāng)便宜的數(shù)據(jù)庫(kù)管理工具,專(zhuān)為簡(jiǎn)化數(shù)據(jù)庫(kù)的管理及降低系統(tǒng)管理成本而設(shè),下面這篇文章主要給大家介紹了關(guān)于使用Navicat生成MySQL測(cè)試數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • MySQL數(shù)據(jù)權(quán)限的實(shí)現(xiàn)詳情

    MySQL數(shù)據(jù)權(quán)限的實(shí)現(xiàn)詳情

    這篇文章主要介紹了MySQL數(shù)據(jù)權(quán)限的實(shí)現(xiàn)詳情,文章通過(guò)實(shí)際案例,從代碼實(shí)戰(zhàn)的角度來(lái)實(shí)現(xiàn)這樣的一個(gè)數(shù)據(jù)權(quán)限。具體詳細(xì)介紹,具有一定的參考價(jià)值
    2022-08-08
  • Mysql提升大數(shù)據(jù)表拷貝效率的解決方案

    Mysql提升大數(shù)據(jù)表拷貝效率的解決方案

    這篇文章主要給大家介紹了關(guān)于Mysql提升大數(shù)據(jù)表拷貝效率的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • mysql中text,longtext,mediumtext區(qū)別小結(jié)

    mysql中text,longtext,mediumtext區(qū)別小結(jié)

    在 MySQL 中,text、mediumtext 和 longtext 都是用來(lái)存儲(chǔ)大量文本數(shù)據(jù)的數(shù)據(jù)類(lèi)型,本文就來(lái)詳細(xì)的介紹一下這三種類(lèi)型的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • MySQL觸發(fā)器的使用詳解

    MySQL觸發(fā)器的使用詳解

    觸發(fā)器trigger是一種特殊的存儲(chǔ)過(guò)程,他在插入(inset)、刪除(delete)或修改(update)特定表中的數(shù)據(jù)時(shí)觸發(fā)執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于MySQL觸發(fā)器使用的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 淺談MySQL模糊查詢中通配符的轉(zhuǎn)義

    淺談MySQL模糊查詢中通配符的轉(zhuǎn)義

    下面小編就為大家?guī)?lái)一篇淺談MySQL模糊查詢中通配符的轉(zhuǎn)義。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • Windows mysql 雙向同步設(shè)置方法 詳細(xì)篇

    Windows mysql 雙向同步設(shè)置方法 詳細(xì)篇

    如果你需要windows mysql 主、備機(jī)雙向同步環(huán)境,可按照以下步驟進(jìn)行操作
    2011-05-05
  • Mysql中varchar類(lèi)型一些需要注意的地方

    Mysql中varchar類(lèi)型一些需要注意的地方

    這篇文章主要介紹了Mysql中varchar類(lèi)型一些需要注意的地方,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2021-01-01

最新評(píng)論

井陉县| 利津县| 溧水县| 繁峙县| 佛学| 吉木萨尔县| 德令哈市| 越西县| 长垣县| 海门市| 武乡县| 广元市| 富蕴县| 寻乌县| 吕梁市| 建昌县| 漳州市| 白沙| 洱源县| 昌图县| 谷城县| 合作市| 桐城市| 遂宁市| 易门县| 鹿泉市| 淮北市| 突泉县| 安徽省| 陆丰市| 丹棱县| 东乌| 鄂托克前旗| 枣阳市| 惠州市| 花垣县| 崇州市| 双流县| 砀山县| 女性| 临夏县|