• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

mysql 搞代码 4年前 (2022-01-09) 27次浏览 已收录 0个评论

转载请注明来源:mysql索引合并:一条sql可以使用多个索引

前言

mysql的索引合并并不是什么新特性。早在mysql5.0版本就已经实现。之所以还写这篇博文,是因为好多人还一直保留着一条sql语句只能使用一个索引的错误观念。本文会通过一些示例来说明如何使用索引合并。

什么是索引合并

下面我们看下mysql文档中对索引合并的说明:

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.

1、索引合并是把几个索引的范围扫描合并成一个索引。
2、索引合并的时候,会对索引进行并集,交集或者先交集再并集操作,以便合并成一个索引。
3、这些需要合并的索引只能是一个表的。不能对多表进行索引合并。

使用索引合并有啥收益

简单的说,索引合并,让一条sql可以使用多个索引。对这些索引取交集,并集,或者先取交集再取并集。从而减少从数据表中取数据的次数,提高查询效率。

怎么确定使用了索引合并

在使用explain对sql语句进行操作时,如果使用了索引合并,那么在输出内容的type列会显示 index_merge,key列会显示出所有使用的索引。如下:

在explain的extra字段中会以下几种:
Using union 索引取并集
Using sort_union 先对取出的数据按rowid排序,然后再取并集
Using intersect 索引取交集

你会发现并没有 sort_intersect,因为根据目前的实现,想索引取交集,必须保证通过索引取出的数据顺序和本文来源gaodai#ma#com搞*代#码9网#rowid顺序是一致的。所以,也就没必要sort了。

sort_union索引合并的示例

数据表结构

1

2

3

4

5

6

7

8

9

10

11

12

13

14

mysql> show create table test\G*************************** 1. row ***************************       Table: testCreate 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=utf81 row in set (0.00 sec)

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql索引合并:一条sql可以使用多个索引

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址