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

MySQL InnoDB 二級(jí)索引的排序示例詳解

 更新時(shí)間:2019年01月09日 10:23:15   作者:coderbee筆記  
這篇文章主要給大家介紹了關(guān)于MySQL InnoDB 二級(jí)索引的排序的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

排序問題

最近看了極客時(shí)間上 《MySQL實(shí)戰(zhàn)45講》,糾正了一直以來對(duì) InnoDB 二級(jí)索引的一個(gè)理解不到位,正好把相關(guān)內(nèi)容總結(jié)下。

PS:本文的所有測(cè)試基于 MySQL 8.0.13 。

先把問題拋出來,下面的 SQL 所創(chuàng)建的表,有兩個(gè)查詢語句,哪個(gè)索引是非必須的?

CREATE TABLE `geek` (
 `a` int(11) NOT NULL,
 `b` int(11) NOT NULL,
 `c` int(11) NOT NULL,
 `d` int(11) NOT NULL,
 PRIMARY KEY (`a`,`b`),
 KEY `c` (`c`),
 KEY `ca` (`c`,`a`),
 KEY `cb` (`c`,`b`)
) ENGINE=InnoDB;

select * from geek where c=N order by a limit 1;
select * from geek where c=N order by b limit 1;

作者給的答案是索引 c 和 ca 的數(shù)據(jù)模型是一樣的,因此 ca 是多余的。為啥??

我們知道,二級(jí)索引里存放的不是行的位置,而是主鍵的值,也知道索引是有序的。

如果 c 與 ca 的數(shù)據(jù)模型一樣,那么就要求二級(jí)索引的葉子節(jié)點(diǎn)不僅是按索引列排序、而且還按關(guān)聯(lián)的主鍵值進(jìn)行排序。

我以前的理解是 二級(jí)索引只按索引列進(jìn)行排序,主鍵值是不排序的。

問了專欄作者,得到的答復(fù)是:索引 c 就是按照 cab 這樣排序,(二級(jí)索引))有保證主鍵算進(jìn)去、還是有序的。(PS:非原話,前后問了三次得到)。

本著 先問是不是,再問為什么 的思路,進(jìn)行一番探究。

是不是?

如果能直接看 InnoDB 的數(shù)據(jù)文件,那就可以直接看出是不是遵循了這樣的排序規(guī)則??上鞘嵌M(jìn)制文件,又沒有順手的工具可以方便查看,放棄。

后來找到了 MySQL 的 handler 語句,它支持 MyISAM/InnoDB 兩種引擎的表。handler 語句提供了直接訪問表存儲(chǔ)引擎的接口。

下面的語法表示讀取指定表指定索引的 第一條/前一條/下一條/最后一條 記錄。

handler table_name/table_name_alias read index_name first/pre/next/last;

就用 handler 語句來驗(yàn)證下,先建一個(gè)簡單的表,插入幾條數(shù)據(jù):

create table t_simple (
 id int primary key,
 v int,
 key k_v (v)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert into t_simple values (1, 5);
insert into t_simple values (10, 5);
insert into t_simple values (4, 5);

上面的插入語句,二級(jí)索引列的值都是一樣的,主鍵不是按順序的,這樣就可以看遍歷時(shí)是不是按主鍵順序存放的。

mysql> handler t_simple open as ts;
Query OK, 0 rows affected (0.00 sec)

mysql> handler ts read k_v next;
+----+------+
| id | v |
+----+------+
| 1 | 5 |
+----+------+
1 row in set (0.00 sec)

mysql> handler ts read k_v next;
+----+------+
| id | v |
+----+------+
| 4 | 5 |
+----+------+
1 row in set (0.00 sec)

mysql> handler ts read k_v next;
+----+------+
| id | v |
+----+------+
| 10 | 5 |
+----+------+
1 row in set (0.00 sec)

從結(jié)果可以看到,遍歷的二級(jí)索引,值相等時(shí),按主鍵的順序遍歷,基本可以確定二級(jí)索引不僅按索引列排序,還按主鍵值排序了。

為什么?

之前一直沒看到說 MySQL 有這樣的機(jī)制,問了前公司和先公司的 DBA 都沒了解過這個(gè)。

最后 DBA 同事找到了 索引擴(kuò)展, Index Extensions ,里面有這么段描述做了說明:

InnoDB automatically extends each secondary index by appending the primary key columns to it. Consider this table definition:

CREATE TABLE t1 (
 i1 INT NOT NULL DEFAULT 0,
 i2 INT NOT NULL DEFAULT 0,
 d DATE DEFAULT NULL,
 PRIMARY KEY (i1, i2),
 INDEX k_d (d)
) ENGINE = InnoDB;

InnoDB 自動(dòng)擴(kuò)展每個(gè)二級(jí)索引,把主鍵值追加到索引列后面,把擴(kuò)展后的組合列作為該索引的索引列。對(duì)于上面 t_simple 表的 k_v 索引,擴(kuò)展后是 (v, id)列。

優(yōu)化器會(huì)根據(jù)擴(kuò)展后的二級(jí)索引的主鍵列來決定如何和是否使用那個(gè)索引。優(yōu)化器可以用擴(kuò)展的二級(jí)索引來進(jìn)行 ref,range,index_merge 等類型的索引訪問、松散的索引掃描、連接和排序優(yōu)化,以及 min()/max() 優(yōu)化。

可以用 show variables like '%optimizer_switch%'; 查看索引擴(kuò)展是否開啟;用 SET optimizer_switch = 'use_index_extensions=on/off'; 進(jìn)行開啟或關(guān)閉,這個(gè)只影響當(dāng)前會(huì)話。

經(jīng)測(cè)試,哪怕關(guān)閉了當(dāng)前會(huì)話的索引擴(kuò)展,用 handler 訪問時(shí)仍然有按主鍵排序的效果。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • MySQL中distinct和group?by去重效率區(qū)別淺析

    MySQL中distinct和group?by去重效率區(qū)別淺析

    distinct 與 group by均可用于去重,下面這篇文章主要給大家介紹了關(guān)于MySQL中distinct和group?by去重效率區(qū)別的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • 記一次MySQL的優(yōu)化案例

    記一次MySQL的優(yōu)化案例

    這篇文章主要介紹了記一次MySQL的優(yōu)化案例,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-10-10
  • msyql show命令匯總

    msyql show命令匯總

    本篇文章是對(duì)msyql中的show命令進(jìn)行了匯總,需要的朋友參考下
    2013-06-06
  • MySQL 數(shù)據(jù)庫 like 語句通配符模糊查詢小結(jié)

    MySQL 數(shù)據(jù)庫 like 語句通配符模糊查詢小結(jié)

    這篇文章主要介紹了MySQL 數(shù)據(jù)庫 like 語句通配符模糊查詢小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(三)--查看字段的長度

    與MSSQL對(duì)比學(xué)習(xí)MYSQL的心得(三)--查看字段的長度

    今天我們來對(duì)比下MYSQL和MSSQL關(guān)于查看字段長度之間的區(qū)別
    2014-06-06
  • 一文帶你了解MySQL中的子查詢

    一文帶你了解MySQL中的子查詢

    子查詢指一個(gè)查詢語句嵌套在另一個(gè)查詢語句內(nèi)部的查詢,這個(gè)特性從MySQL 4.1開始引入,SQL中子查詢的使用大大增強(qiáng)了SELECT 查詢的能力,本文帶大家詳細(xì)了解MySQL中的子查詢,需要的朋友可以參考下
    2023-06-06
  • mysql存儲(chǔ)中使用while批量插入數(shù)據(jù)(批量提交和單個(gè)提交的區(qū)別)

    mysql存儲(chǔ)中使用while批量插入數(shù)據(jù)(批量提交和單個(gè)提交的區(qū)別)

    這篇文章主要介紹了mysql存儲(chǔ)中使用while批量插入數(shù)據(jù)(批量提交和單個(gè)提交的性能差異),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL中外鍵的創(chuàng)建、約束以及刪除

    MySQL中外鍵的創(chuàng)建、約束以及刪除

    這篇文章主要給大家介紹了關(guān)于MySQL中外鍵的創(chuàng)建、約束以及刪除的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 允許遠(yuǎn)程訪問MySQL的實(shí)現(xiàn)方式

    允許遠(yuǎn)程訪問MySQL的實(shí)現(xiàn)方式

    這篇文章主要介紹了允許遠(yuǎn)程訪問MySQL的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • mysql列轉(zhuǎn)行方法超詳細(xì)講解

    mysql列轉(zhuǎn)行方法超詳細(xì)講解

    mysql行列轉(zhuǎn)換在項(xiàng)目中應(yīng)用的極其頻繁,下面這篇文章主要給大家介紹了關(guān)于mysql列轉(zhuǎn)行方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09

最新評(píng)論

张北县| 中牟县| 涟水县| 德昌县| 黄梅县| 芮城县| 文安县| 娄烦县| 关岭| 德州市| 沙田区| 奉化市| 大余县| 赤水市| 耿马| 龙泉市| 铜山县| 佛学| 甘肃省| 黄大仙区| 陵川县| 永善县| 华亭县| 澎湖县| 中宁县| 临潭县| 抚州市| 宁阳县| 东山县| 大厂| 五莲县| 定州市| 军事| 普宁市| 全南县| 德令哈市| 游戏| 梧州市| 廉江市| 厦门市| 贺州市|