精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

索引合并,能不用就不要用吧!

數據庫 MySQL
索引合并看著似乎提升了 MySQL 搜索的性能,然而,一般出現索引合并,大概率都是因為索引創建的不合理,我們需要重新審視自己的索引。

在前面的文章中,松哥和小伙伴們分享了 MySQL 中,InnoDB 存儲引擎的數據結構,小伙伴們知道,當我們使用索引進行搜索的時候,每一次的搜索都是在某一棵 B+Tree 中搜索的,如果使用了二級索引的話,可能還會涉及到回表。

那么現在問題來了,如果我們的搜索條件中包含兩個字段,且這兩個字段都有獨立的索引,那么 MySQL 會怎么處理?今天我們就來討論下這個話題。

1. 問題重現

為了方便小伙伴們理解,我先通過 SQL 來把我的問題重復一下。

我使用的測試數據是 MySQL 官網提供的測試數據,相關的介紹文檔在:

  • https://dev.mysql.com/doc/employee/en/

相應的數據庫腳本在:

  • https://github.com/datacharmer/test_db

小伙伴們可以自行下載這個數據庫腳本并導入到自己的數據庫之中。

在官方提供的案例中,有一個這樣的表:

CREATE TABLE `film_actor` (
  `actor_id` smallint unsigned NOT NULL,
  `film_id` smallint unsigned NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`actor_id`,`film_id`),
  KEY `idx_fk_film_id` (`film_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

在這個表中有兩個索引,其中一個是主鍵索引,主鍵索引是一個聯合索引,還有一個是根據 film_id 建立的普通索引。現在假設我有如下 SQL 需要執行:

select * from film_actor where film_id=1 or actor_id=1;

那么問題來了,這個查詢會用到索引嗎?

想知道有沒有用到索引,用 explain 關鍵字看一下就知道了:

explain select * from film_actor where film_id=1 or actor_id=1;

執行結果如下:

圖片

小伙伴們看到,此時 type 是 index_merge,possible_keys 和 key 中,都給出來了兩個索引,Extra 中的值為 Using union(idx_fk_film_id,PRIMARY); Using where。

看起來是用了索引,但是具體是怎么用的,這個執行計劃該如何解讀呢?

這個其實就是一個索引合并,接下來我們就來看下到底什么是索引合并。

2. 索引合并

index_merge 表示索引合并,當同一個表中的搜索條件中同時存在多個索引的時候,MySQL 會分別對這些索引進行掃描,然后將掃描結果進行合并,合并分三種情況:

  1. 對各自掃描結果求并集(unions)。
  2. 對各自掃描結果求交集(intersections)。
  3. 前兩者的組合。

在官方文檔中給了四個可能會用到索引合并的例子:

SELECT * FROM tbl_name WHERE key1 = 10 OR key2 = 20;

SELECT * FROM tbl_name
  WHERE (key1 = 10 OR key2 = 20) AND non_key = 30;

SELECT * FROM t1, t2
  WHERE (t1.key1 IN (1,2) OR t1.key2 LIKE 'value%')
  AND t2.key1 = t1.some_col;

SELECT * FROM t1, t2
  WHERE t1.key1 = 1
  AND (t2.key1 = t1.some_col OR t2.key2 = t1.some_col2);

有的時候,我們寫的 SQL,明明可以合并,但是系統卻沒有合并,此時我們對查詢條件做一些調整,例如:

  • (x AND y) OR z => (x OR z) AND (y OR z)
  • (x OR y) AND z => (x AND z) OR (y AND z)

另外需要注意的是,索引合并不適用于全文索引。

在 explain 執行計劃中,如果用到了索引合并,Extra 字段的值一般分為三種情況,分別是:

  • Using intersect(...)
  • Using union(...)
  • Using sort_union(...)

上文案例屬于第二種情況。

那么接下來把這三種情況都來和小伙伴們聊一下。

2.1 Using intersect(...)

這個就是對多個掃描結果求交集。

并不是只要涉及到多個索引,且是 AND,就會觸發 Using intersect,有兩個條件:

  • 如果是二級索引,則必須是等值查詢。如果二級索引是復合索引,則復合索引的每一列都必須覆蓋到,不能只是其中的某幾列。
  • 主鍵索引可以是范圍查詢。

我們來看官方給出的一個例子,如下:

key_part1 = const1 AND key_part2 = const2 ... AND key_partN = constN

key_part1 - key_partN 就是復合索引中的所有列(必須是所有列)。

對于第 2 點,如果涉及到主鍵索引,則主鍵索引可以是范圍查詢,例如下面這樣(但是二級索引依然只能是等值查詢):

SELECT * FROM innodb_table WHERE primary_key < 10 AND key_col1 = 20;

如果是復合索引和普通索引,那么復合索引必須覆蓋到所有列且復合索引和普通索引都要是等值匹配才可以,例如下面這樣:

SELECT * FROM tbl_name WHERE key1_part1 = 1 AND key1_part2 = 2 AND key2 = 2;

key1_part1 和 key1_part2 分別表示同一個復合索引的第一列和第二列(一共就兩列),此時和 key2 一起作為查詢條件,也有可能會用到索引合并。

上面這些情況都是在各自搜索完成之后求交集。

舉一個簡單的例子吧,還是 MySQL 官方的測試數據,sakila 庫中有一個 actor 表,該表結構如下:

CREATE TABLE `actor` (
  `actor_id` smallint unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(45) NOT NULL,
  `last_name` varchar(45) NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`actor_id`),
  KEY `idx_actor_last_name` (`last_name`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8mb3;

可以看到,有一個主鍵,有一個普通索引,我執行如下 SQL:

select * from actor where actor_id<10 and last_name='WAHLBERG'

執行計劃如下:

圖片

可以看到,用到了索引合并,且是 Using intersect。

2.2 Using union(...)

求并集的跟求交集的比較像,就是 AND 變成了 OR。

當二級索引是等值查詢,或者是組合索引,但是要求組合索引的每一列都必須覆蓋到,不能只是覆蓋到部分列,例如下面這個查詢條件:

key_part1 = const1 OR key_part2 = const2 ... OR key_partN = constN

key_part1~key_partN 就是同一個復合索引的不同列,同時在該復合索引中,也一共就只有這 N 個字段,這種情況就會用到 Using union。

InnoBD 表上的主鍵范圍查詢也有可能會觸發 Using union。

符合 2.1 小節的情況,將 AND 換成 OR 之后,也有可能會觸發 Using union。

這個例子就不用舉了,文章一開始的就是。

2.3 Using sort_union(...)

很明顯,2.2 小節的條件比較苛刻,二級索引必須是等值查詢才能觸發 Using union,而我們日常使用的時候,范圍查詢也是非常常見的,所以又有了 Using sort_union,這個的要求就寬松一些了:

  • 二級索引也可以按照范圍匹配
  • 復合索引也不用覆蓋所有列

舉個例子,如下面的 SQL:

SELECT * FROM tbl_name
  WHERE key_col1 < 10 OR key_col2 < 20;

SELECT * FROM tbl_name
  WHERE (key_col1 > 10 OR key_col2 = 20) AND nonkey_col = 30;

二級索引范圍搜索,也有可能觸發 Using sort_union 的。

2.4 索引合并原理

在 2.1 小節和 2.2 小節,分別是求交集和求并集,為了 intersect 和 union 操作方便,在各個單獨的索引掃描的時候,都是要獲取到有序的主鍵值的合集,各個索引都獲取到有序的主鍵,然后求交集或者并集就會比較方便。

因此,在 2.1 和 2.2 小節,都是主鍵索引可以范圍搜索,因為主鍵索引本身主鍵就是有序的;二級索引則有諸多限制,這諸多限制的最終目的都是為了做到最終拿到的主鍵值是有序的。

例如:

  • 二級索引必須等值匹配,等值匹配意味著最終拿到的 B+Tree 的葉子上的主鍵值就是唯一的;二級索引如果可以按照范圍查找,那么最終從二級索引的 B+Tree 的葉子結點上拿到的主鍵值就不是有序的了。
  • 類似的,復合索引必須覆蓋到所有列也是相似的原因,因為如果沒有覆蓋到所有列,意味著最終拿到的主鍵值也是無序的。

2.3 小節允許二級索引按照范圍搜索,這是因為在 Using sort_union 中,會先對拿到的主鍵值進行排序,然后才會去求交集或者并集,當然,相比于 2.1 和 2.2 小節,2.3 小節的性能也會降低一些。

3. 索引合并的問題

索引合并看著似乎提升了 MySQL 搜索的性能,然而,一般出現索引合并,大概率都是因為索引創建的不合理,我們需要重新審視自己的索引。

如上面 2.3 小節所述,這種方式在查詢的過程中需要緩存臨時數據、需要排序然后才能求交集或者并集,這些操作都會消耗掉大部分的 CPU 和內存資源。并且這些消耗不會被計算到查詢成本中,因為 MySQL 優化器只關心隨機頁面的讀取問題,并不會關心這里涉及到的這些額外計算問題,所以,在一些極端情況下,索引合并的性能可能還不如全表掃描。

因此,有時候如果我們確定自己不需要索引合并,那么可以通過 ignore index 來忽略掉一些索引,如下(對比 2.1 小節截圖):

圖片

也可以通過 optimizer_switch 來關閉索引合并功能,如下:

圖片

好啦,索引合并就和小伙伴們聊這么多吧~感興趣的小伙伴也可以嘗試下哦!

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2010-03-22 16:20:15

虛擬化服務器虛擬化

2010-10-20 09:01:36

2016-10-21 10:00:01

HTML標簽WEB

2021-01-20 07:28:02

nullcollections對象

2018-03-12 10:57:14

JavaKotlin語法

2023-02-26 15:49:08

元宇宙ChatGPT

2022-04-13 08:43:46

工廠模式接口解析器

2014-12-31 10:33:44

Google 2015

2020-04-13 08:33:39

高并發秒殺系統

2015-08-04 08:56:14

swift子類

2021-12-13 01:40:29

ElasticSear倒排索引

2024-07-15 11:41:14

2016-12-07 08:21:28

HTMLCSSJS

2014-12-09 09:13:46

BaaS云備份備份即服務

2011-08-09 16:08:53

數據庫連接

2015-03-19 14:53:17

面向對象程序員新手程序員

2015-01-09 15:22:11

2022-05-31 12:26:50

移動響應css

2019-10-12 09:30:48

微信外掛

2025-08-07 06:00:00

前端日期處理Date
點贊
收藏

51CTO技術棧公眾號

蜜桃视频最新网址| 丁香婷婷激情网| 亚洲第一成人av| 亚洲久久成人| 亚洲图片在区色| 91pony九色| 国产高清视频色在线www| 91在线云播放| 国产欧美精品一区二区三区介绍| www.超碰在线观看| 神马午夜久久| 91精品国产综合久久蜜臀| 国产一区二区视频播放| av免费观看一区二区| 国产xxx精品视频大全| 国产99久久精品一区二区| 在线免费观看亚洲视频| 神马电影久久| 日韩精品一区二区三区在线观看 | av在线免费观看网| 国产成人一区二区精品非洲| 国内精品400部情侣激情| 99精品全国免费观看| 粉嫩一区二区三区四区公司1| 91成人免费在线视频| www婷婷av久久久影片| 国产精品毛片一区二区三区四区| 国产福利不卡视频| 国产精品久久不能| 五月天婷婷综合网| 亚洲人metart人体| 亚洲性xxxx| 国产xxxxxxxxx| 欧美a在线观看| 欧美三级欧美一级| 黑人糟蹋人妻hd中文字幕| 在线看福利影| 日韩一区有码在线| 日韩欧美亚洲日产国产| 色视频精品视频在线观看| 国产精品99久久久久久似苏梦涵| 国产精品久久色| 9i精品福利一区二区三区| 亚洲小说区图片区| 欧美另类在线播放| 欧美成人精品欧美一级私黄| 91综合网人人| 色综合影院在线| 蜜桃久久精品成人无码av| 日韩欧美中文字幕电影| 精品国产露脸精彩对白| 欧美一区二区三区影院| 精品国产亚洲一区二区三区在线 | 亚洲精品视频免费看| 亚洲在线视频一区二区| 91在线不卡| 欧美国产日韩一二三区| 三区精品视频| 91高清在线| 中文字幕精品一区二区三区精品| 欧美在线3区| 六十路在线观看| 日本一区二区三区久久久久久久久不| 欧美一区二区综合| 成人影院免费观看| 中文字幕日韩一区二区| 在线丝袜欧美日韩制服| 国产美女av在线| 亚洲精品乱码久久久久久| 8x8x华人在线| 欧美亚洲系列| 五月天亚洲婷婷| 男人天堂999| 欧美日韩在线精品一区二区三区激情综合 | 日韩欧美国产三级| 亚洲高清无码久久| 亚洲欧洲免费| 色综合伊人色综合网| 婷婷久久综合网| 欧美另类综合| 国产91成人video| 国产乱码77777777| 久久狠狠亚洲综合| 不卡一卡2卡3卡4卡精品在| 乱精品一区字幕二区| 久久综合色播五月| 亚洲精品一卡二卡三卡四卡| 超碰公开在线| 天天影视色香欲综合网老头| 无码内射中文字幕岛国片| 四虎精品在线观看| 精品国产91久久久久久久妲己| 鲁大师私人影院在线观看| 欧美亚洲高清| 欧美日韩国产成人高清视频| 久久艹免费视频| 久久精品国产久精国产爱| 91日韩久久| 美女毛片在线看| 亚洲女人****多毛耸耸8| 国产九九九九九| 只有精品亚洲| 亚洲欧洲黄色网| 麻豆明星ai换脸视频| 国产精品女主播一区二区三区| 国产精品一区=区| 丁香花免费高清完整在线播放 | 乱h高h女3p含苞待放| 校园春色综合网| 亚洲影院色无极综合| 免费在线观看一级毛片| 亚洲免费观看高清完整版在线观看| 91专区在线观看| 日本成人手机在线| 在线播放亚洲激情| 中日韩黄色大片| 一区二区精品| 成人资源视频网站免费| 在线看免费av| 色婷婷久久久亚洲一区二区三区| 日本亚洲一区二区三区| re久久精品视频| 97视频国产在线| 精品久久久中文字幕人妻| 欧美激情一区二区三区蜜桃视频| 毛片在线播放视频| 2020最新国产精品| www.久久久久| 波多野结衣一区二区三区在线 | 久久99蜜桃综合影院免费观看| 精品51国产黑色丝袜高跟鞋| 欧美中文字幕一区| 少妇真人直播免费视频| 亚洲高清在线| 国产 高清 精品 在线 a| 激情影院在线观看| 欧美视频精品在线| 国产毛片欧美毛片久久久| 免费精品视频| 裸模一区二区三区免费| ****av在线网毛片| 精品99999| 九九视频免费观看| 国产成人在线视频免费播放| 日韩亚洲欧美精品| 怡红院成人在线| 亚洲精选一区二区| 国产乱国产乱老熟| www国产精品av| 2022亚洲天堂| 亚洲最好看的视频| 欧洲成人性视频| 欧美男男激情freegay| 日韩欧美综合在线视频| 精品人妻少妇嫩草av无码| 制服诱惑一区二区| 蜜桃传媒视频麻豆第一区免费观看 | 亚洲精品小区久久久久久| 国产91精品不卡视频| 日本私人网站在线观看| 91久久精品国产91性色tv| 无码一区二区三区在线| 日本视频免费一区| 精品欧美aⅴ在线网站| 4438全国成人免费| 凸凹人妻人人澡人人添| 婷婷丁香激情综合| 成年人的黄色片| 久久激情久久| 亚洲三级一区| 亚洲精品在线a| 91高清视频在线免费观看| 亚洲av成人精品毛片| 色噜噜久久综合| 亚洲欧美精品久久| 国产精品91xxx| 妺妺窝人体色www在线小说| 国产精品中文字幕亚洲欧美| 国产拍精品一二三| 日本在线视频www鲁啊鲁| 亚洲国产古装精品网站| 看黄色一级大片| 亚洲人成伊人成综合网小说| 午夜男人的天堂| 可以免费看不卡的av网站| 爱爱爱视频网站| 黄色美女久久久| 国产精品久久久久av免费| 国产精品一区二区三区视频网站| 亚洲第一区中文字幕| 奴色虐av一区二区三区| 一区二区三区久久| 欧美bbbbb性bbbbb视频| 免费久久精品视频| 中文字幕无码精品亚洲资源网久久| av影片在线看| 性欧美长视频| 少妇免费毛片久久久久久久久| 精品一区二区三区中文字幕视频| 96精品视频在线| 日本免费中文字幕在线| 日韩成人在线播放| 国产精品一区二区av白丝下载| 亚洲午夜精品一区二区三区他趣| 摸摸摸bbb毛毛毛片| 国产成人av电影在线观看| 国产偷人视频免费| 午夜亚洲福利| 少妇特黄a一区二区三区 | 91精品国产综合久久精品麻豆 | 日韩成人午夜电影| 亚洲一区二区三区av无码| 精品国产一区二区三区香蕉沈先生 | 欧美成人xxxxx| 午夜国产一区| 亚洲一区二区精品在线| 亚洲另类春色校园小说| 国产精品国产三级欧美二区 | 污污视频在线看| 在线国产精品播放| 日韩精品视频无播放器在线看 | 妖精视频在线观看免费| www.久久精品| 色婷婷狠狠18禁久久| 另类人妖一区二区av| 欧美性大战久久久久xxx| 伊人激情综合| 日韩一区二区高清视频| 99久久夜色精品国产亚洲1000部| 欧美日韩亚洲综合一区二区三区激情在线| 日本一区二区乱| 成人免费自拍视频| 成人免费一区| 国产精品久久不能| 日韩漫画puputoon| 国产成人一区二区三区| 性欧美又大又长又硬| 91精品国产高清久久久久久91 | 特黄特色免费视频| 韩国精品一区二区| 中日韩av在线播放| 老司机精品视频导航| 黄色在线视频网| 日韩福利视频导航| 成人在线免费观看av| 亚洲精品字幕| 免费无码不卡视频在线观看| 伊人激情综合| 又粗又黑又大的吊av| 亚洲精品一二| 日本中文字幕片| 久久婷婷一区| 国产wwwxx| 另类成人小视频在线| 亚洲精品自拍网| 精品一二线国产| 奇米777在线| 福利一区在线观看| 性生交大片免费看l| 成人精品视频一区二区三区| 欧美极品jizzhd欧美仙踪林| 不卡av在线免费观看| 特大黑人巨人吊xxxx| 久久综合久久综合亚洲| 自拍偷拍你懂的| 亚洲欧洲制服丝袜| 国产在线成人精品午夜| 亚洲v日本v欧美v久久精品| 免费观看成人毛片| 欧美性一区二区| 国产老女人乱淫免费| 精品噜噜噜噜久久久久久久久试看| 黄色aaa大片| 亚洲精品在线91| 性开放的欧美大片| 欧美国产精品人人做人人爱| 成人免费观看在线观看| 国产福利精品视频| 国产精品1区在线| 激情小说综合区| av中文一区| 日韩专区第三页| 久久av最新网址| 成人综合久久网| 东方aⅴ免费观看久久av| 大又大又粗又硬又爽少妇毛片| 中文字幕不卡的av| 免费在线一区二区三区| 亚洲成人动漫av| 中文字幕在线网址| 精品国产伦一区二区三区观看体验| 亚洲欧美丝袜中文综合| 色婷婷久久一区二区| av中文在线资源| 国产精品一区二区久久国产| www.国产精品一区| 日本一区二区三区四区在线观看| 正在播放日韩欧美一页| 亚洲熟妇av一区二区三区漫画| 久久99精品久久久久久动态图 | 日韩免费高清在线| 国产精品亚洲成人| 亚洲理论片在线观看| 亚洲精品乱码久久久久久黑人| 日本高清不卡码| 欧美电影免费提供在线观看| 成年女人的天堂在线| 久久久欧美精品| 中文字幕成人| 五月天亚洲综合| 一区二区三区高清视频在线观看| 亚欧精品在线视频| 久久久国产精品午夜一区ai换脸| 欧美成人一区二区三区高清| 欧美亚洲国产怡红院影院| 黑人精品一区二区| 久久久国产精品一区| av日韩亚洲| 国产视频一区二区三区四区| 99精品综合| youjizzxxxx18| 久久众筹精品私拍模特| 国产在线综合网| 欧美一级欧美三级| 永久免费在线观看视频| 国产精品av在线播放| 欧美丝袜美腿| av高清在线免费观看| 国产美女娇喘av呻吟久久| 99久久久无码国产精品不卡| 91九色02白丝porn| 青青免费在线视频| 97在线观看视频| 国产亚洲精品美女久久| 免费人成在线观看视频播放| 国产一区二区三区免费| 亚洲aaa视频| 欧美日韩aaaaa| 成人在线免费观看| 国产精品永久免费| 精品视频免费在线观看| 日韩 欧美 高清| 久久久不卡网国产精品一区| 久久国产精品免费看| 日韩成人av网址| 欲香欲色天天天综合和网| 久久99精品久久久久久久青青日本 | 午夜精品理论片| 大陆精大陆国产国语精品| 日本免费a视频| 成人性生交大片免费| 亚洲一区二区91| 亚洲国模精品一区| 久草免费在线视频| 欧美婷婷久久| 日韩av网站免费在线| 日本一二三不卡视频| 欧美日韩中文国产| 黄视频网站在线| 亚洲伊人成综合成人网| 国产精品草草| 人妻丰满熟妇av无码久久洗澡| 欧美性xxxx极品hd欧美风情| 欧美中文在线| 国产精品自拍视频| 综合视频在线| 午夜不卡久久精品无码免费| 欧美日韩国产精品一区| 国产一级片在线| 国产日本欧美在线观看| 欧美欧美天天天天操| 成人手机在线免费视频| 欧美午夜精品久久久久久孕妇| 午夜激情视频在线| 97av影视网在线观看| 99精品国产一区二区青青牛奶 | 国产91色在线|免| 日韩精品一区二区久久| 韩国三级丰满少妇高潮| 精品久久久久久久久久久久久久| 可以直接在线观看的av| 91精品国产综合久久香蕉| 极品日韩av| 亚洲av成人无码久久精品| 56国语精品自产拍在线观看| 精品一性一色一乱农村| 欧美高清视频一区| 精品制服美女久久| 国产女同在线观看| 日韩在线视频一区| 国产精品一区二区三区美女| 超碰在线97免费| 午夜精品在线看| 1024国产在线| 国产一区免费在线| 麻豆精品久久久| 黄色片中文字幕| 欧美国产日韩二区| 精品产国自在拍| 尤物网站在线观看|