日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql 可以用多个索引_mysql索引合并:一条sql可以使用多个索引

發(fā)布時(shí)間:2025/3/12 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 可以用多个索引_mysql索引合并:一条sql可以使用多个索引 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

mysql的索引合并并不是什么新特性。早在mysql5.0版本就已經(jīng)實(shí)現(xiàn)。之所以還寫(xiě)這篇博文,是因?yàn)楹枚嗳诉€一直保留著一條sql語(yǔ)句只能使用一個(gè)索引的錯(cuò)誤觀念。本文會(huì)通過(guò)一些示例來(lái)說(shuō)明如何使用索引合并。

什么是索引合并

下面我們看下mysql文檔中對(duì)索引合并的說(shuō)明:

The Index Merge method is used to retrieve rows with several range scans and to merge their results into one. The merge can produce unions, intersections, or unions-of-intersections of its underlying scans. This access method merges index scans from a single table; it does not merge scans across multiple tables.

根據(jù)官方文檔中的說(shuō)明,我們可以了解到:

1、索引合并是把幾個(gè)索引的范圍掃描合并成一個(gè)索引。

2、索引合并的時(shí)候,會(huì)對(duì)索引進(jìn)行并集,交集或者先交集再并集操作,以便合并成一個(gè)索引。

3、這些需要合并的索引只能是一個(gè)表的。不能對(duì)多表進(jìn)行索引合并。

怎么確定使用了索引合并

在使用explain對(duì)sql語(yǔ)句進(jìn)行操作時(shí),如果使用了索引合并,那么在輸出內(nèi)容的type列會(huì)顯示 index_merge,key列會(huì)顯示出所有使用的索引。如下:

使用索引合并的示例

數(shù)據(jù)表結(jié)構(gòu)

mysql> show create table test\G

*************************** 1. row ***************************

Table: test

Create Table: CREATE TABLE `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`key1_part1` int(11) NOT NULL DEFAULT '0',

`key1_part2` int(11) NOT NULL DEFAULT '0',

`key2_part1` int(11) NOT NULL DEFAULT '0',

`key2_part2` int(11) NOT NULL DEFAULT '0',

PRIMARY KEY (`id`),

KEY `key1` (`key1_part1`,`key1_part2`),

KEY `key2` (`key2_part1`,`key2_part2`)

) ENGINE=MyISAM AUTO_INCREMENT=18 DEFAULT CHARSET=utf8

1 row in set (0.00 sec)

數(shù)據(jù)

mysql> select * from test;

+----+------------+------------+------------+------------+

| id | key1_part1 | key1_part2 | key2_part1 | key2_part2 |

+----+------------+------------+------------+------------+

| 1 | 1 | 1 | 1 | 1 |

| 2 | 1 | 1 | 2 | 1 |

| 3 | 1 | 1 | 2 | 2 |

| 4 | 1 | 1 | 3 | 2 |

| 5 | 1 | 1 | 3 | 3 |

| 6 | 1 | 1 | 4 | 3 |

| 7 | 1 | 1 | 4 | 4 |

| 8 | 1 | 1 | 5 | 4 |

| 9 | 1 | 1 | 5 | 5 |

| 10 | 2 | 1 | 1 | 1 |

| 11 | 2 | 2 | 1 | 1 |

| 12 | 3 | 2 | 1 | 1 |

| 13 | 3 | 3 | 1 | 1 |

| 14 | 4 | 3 | 1 | 1 |

| 15 | 4 | 4 | 1 | 1 |

| 16 | 5 | 4 | 1 | 1 |

| 17 | 5 | 5 | 1 | 1 |

| 18 | 5 | 5 | 3 | 3 |

| 19 | 5 | 5 | 3 | 1 |

| 20 | 5 | 5 | 3 | 2 |

| 21 | 5 | 5 | 3 | 4 |

| 22 | 6 | 6 | 3 | 3 |

| 23 | 6 | 6 | 3 | 4 |

| 24 | 6 | 6 | 3 | 5 |

| 25 | 6 | 6 | 3 | 6 |

| 26 | 6 | 6 | 3 | 7 |

| 27 | 1 | 1 | 3 | 6 |

| 28 | 1 | 2 | 3 | 6 |

| 29 | 1 | 3 | 3 | 6 |

+----+------------+------------+------------+------------+

29 rows in set (0.00 sec)

使用索引合并的案例

mysql> explain select * from test where (key1_part1=4 and key1_part2=4) or key2_part1=4\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: test

type: index_merge

possible_keys: key1,key2

key: key1,key2

key_len: 8,4

ref: NULL

rows: 3

Extra: Using sort_union(key1,key2); Using where

1 row in set (0.00 sec)

未使用索引合并的案例

mysql> explain select * from test where (key1_part1=1 and key1_part2=1) or key2_part1=4\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: test

type: ALL

possible_keys: key1,key2

key: NULL

key_len: NULL

ref: NULL

rows: 29

Extra: Using where

1 row in set (0.00 sec)

從上面的兩個(gè)案例大家可以發(fā)現(xiàn),相同模式的sql語(yǔ)句,可能有時(shí)能使用索引,有時(shí)不能使用索引。是否能使用索引,取決于mysql查詢(xún)優(yōu)化器對(duì)統(tǒng)計(jì)數(shù)據(jù)分析后,是否認(rèn)為使用索引更快。

因此,單純的討論一條sql是否可以使用索引有點(diǎn)片面,還需要考慮數(shù)據(jù)。

注意事項(xiàng)

mysql5.6.7之前的版本遵守range優(yōu)先的原則。也就是說(shuō),當(dāng)一個(gè)索引的一個(gè)連續(xù)段,包含所有符合查詢(xún)要求的數(shù)據(jù)時(shí),哪怕索引合并能提供效率,也不再使用索引合并。舉個(gè)例子:

mysql> explain select * from test where (key1_part1=1 and key1_part2=1) and key2_part1=1\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: test

type: ref

possible_keys: key1,key2

key: key2

key_len: 4

ref: const

rows: 9

Extra: Using where

1 row in set (0.00 sec)

上面符合查詢(xún)要求的結(jié)果只有一條,而這一條記錄被索引key2所包含。

可以看到這條sql語(yǔ)句使用了key2索引。但是這個(gè)并不是最快的執(zhí)行方式。其實(shí),把索引key1和索引key2進(jìn)行索引合并,取交集后,就發(fā)現(xiàn)只有一條記錄適合。應(yīng)該查詢(xún)效率會(huì)更快。

tips:這條sql語(yǔ)句未在mysql5.6.7之后版本執(zhí)行驗(yàn)證,以上為理論推導(dǎo)。有興趣的話,您可以到mysql5.6.7之后版本上驗(yàn)證下。

覺(jué)得文章有用?立即:

和朋友一起 共學(xué)習(xí) 共進(jìn)步!

猜您喜歡

總結(jié)

以上是生活随笔為你收集整理的mysql 可以用多个索引_mysql索引合并:一条sql可以使用多个索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。