mysql怎么合并索引 Mysql怎么用索引

Mysql:联合索引和索引合并有关系吗【mysql怎么合并索引 Mysql怎么用索引】你有索引index1(a,b,c)mysql怎么合并索引,这是是联合索引mysql怎么合并索引,也叫复合索引、多列索引;
你有索引index2(a)mysql怎么合并索引,index3(b),index4(c),然后你的sql中有and、or或union之类的条件对三个索引分别进行条件扫描,然后将各自的结果进行合并 , 这叫索引合并,这时你用explain查看执行计划会看到有“index merge”字样 。
至于两者有没有关系,这怎么讲呢,一般来说,联合索引(复合索引)的效率要比索引合并要高,在能使用联合索引时尽量使用联合索引,当然这要根据具体情况,sql中寸在“or”这样的连接词时,那就可能必须要使用索引合并了 。
关于MySQL复合索引的使用方法 MySQL的复合索引可以创建多个,每个复合索引可以包含一列或多列 。复合索引使用的基本原则是左侧对齐原则 。例如,复合索引包含A,B , C字段,实际相当于创建了5个索引,即:
那么问题来了,如果我们创建两个复合索引,复合索引1:包含A , B,C列和复合索引2:包含B,C列,MySQL如何执行呢?
按照正常的逻辑 , 和复合索引的原则,应该能命中的索引是A_B_C_index,让我们拭目以待吧!
结果:和上次测试的不一致,这次虽然包含ABC三个列 , 但命中的索引是B_C_index
重要结论:当命中两个或者多个不同的复合索引时,按照创建顺序不同,MySQL会有不同策略来选取其中的一个复合索引 。
mysql 联合索引原理详述在一个市民信息表上mysql怎么合并索引 , 是否有必要将身份证号
和名字建立联合索引mysql怎么合并索引?
假设这个市民表的定义是这样的mysql怎么合并索引:
CREATE TABLE `tuser` (
`id` int(11) NOT NULL,
`id_card` varchar(32) DEFAULT NULL,
`name` varchar(32) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`ismale` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `id_card` (`id_card`),
KEY `name_age` (`name`,`age`)
) ENGINE=InnoDB
我们知道,身份证号是市民的唯一标识 。也就是说 , 如果有根据身份证号查询市民信息的需求,
我们只要在身份证号字段上建立索引就够了 。而再建立一个(身份证号、姓名)的联合索引,是
不是浪费空间?
如果现在有一个高频请求,要根据市民的身份证号查询他的姓名,这个联合索引就有意义了 。它
可以在这个高频请求上用到覆盖索引,不再需要回表查整行记录,减少语句的执行时间 。
当然,索引字段的维护总是有代价的 。因此,在建立冗余索引来支持覆盖索引时就需要权衡考虑
了 。这正是业务 DBA,或者称为业务数据架构师的工作 。
最左前缀原则
看到这里你一定有一个疑问,如果为每一种查询都设计一个索引,索引是不是太多了 。如果我现
在要按照市民的身份证号去查他的家庭地址呢?虽然这个查询需求在业务中出现的概率不高,但
总不能让它走全表扫描吧?反过来说,单独为一个不频繁的请求创建一个(身份证号 , 地址)的
索引又感觉有点浪费 。应该怎么做呢?
这里,我先和你说结论吧 。B树这种索引结构,可以利用索引的“最左前缀” , 来定位记录 。
为了直观地说明这个概念,我们用(name,age)这个联合索引来分析 。
图 2 (name,age)索引示意图
可以看到,索引项是按照索引定义里面出现的字段顺序排序的 。
当你的逻辑需求是查到所有名字是“张三”的人时,可以快速定位到 ID4,然后向后遍历得到所有
需要的结果 。
如果你要查的是所有名字第一个字是“张”的人,你的 SQL 语句的条件是"where name like ‘张
%’" 。这时,你也能够用上这个索引 , 查找到第一个符合条件的记录是 ID3,然后向后遍历,直
到不满足条件为止 。
可以看到,不只是索引的全部定义,只要满足最左前缀,就可以利用索引来加速检索 。这个最左
前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符 。
基于上面对最左前缀索引的说明,我们来讨论一个问题:在建立联合索引的时候,如何安排索引
内的字段顺序 。
这里我们的评估标准是,索引的复用能力 。因为可以支持最左前缀,所以当已经有了 (a,b) 这个
联合索引后,一般就不需要单独在 a 上建立索引了 。因此 , 第一原则是,如果通过调整顺序 , 可
以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的 。
所以现在你知道了 , 这段开头的问题里,我们要为高频请求创建 (身份证号 , 姓名)这个联合索
引,并用这个索引支持“根据身份证号查询地址”的需求 。
那么 , 如果既有联合查询,又有基于 a、b 各自的查询呢?查询条件里面只有 b 的语句,是无法
使用 (a,b) 这个联合索引的,这时候你不得不维护另外一个索引,也就是说你需要同时维护
(a,b)、(b) 这两个索引 。
这时候,我们要考虑的原则就是空间了 。比如上面这个市民表的情况,name 字段是比 age 字段
大的,那我就建议你创建一个(name,age) 的联合索引和一个 (age) 的单字段索引 。
mysql索引(九)索引合并 索引合并是mysql底层为我们提供的智能算法 。mysql怎么合并索引了解索引合并的算法mysql怎么合并索引,有助于我们更好的创建索引 。
索引合并是通过多个range类型的扫描并且合并它们的结果集来检索行的 。仅合并来自单个表的索引扫描mysql怎么合并索引,而不是跨多个表的索引扫描 。合并会产生底层扫描的三种形式mysql怎么合并索引:unions(合并)、intersections(交集)、unions-of-intersections(先取交集再合并) 。
以下四个例子会产生索引合并:
索引合并有以下已知的局限性:
1、如果查询语句包含一个带有严重AND/OR嵌套的复杂的WHERE子句而MySQL没有选择最佳计划,那么可以尝试使用以下的标志符转换:
(x AND y) OR z = (x OR z) AND (y OR z)
(x OR y) AND z = (x AND z) OR (y AND z)
2、索引合并不适用于全文索引 。
在 EXPLAIN 语句输出的信息中,索引合并在type列中表现为“index_merge” , 在这种情况下,key列包含使用的索引列表 。
索引合并访问方法有几种算法,表现在 EXPLAIN 语句输出的Extra字段中:
下面将更详细地描述这些算法 。优化器根据各种可用选项的成本估计,在不同的索引合并算法和其mysql怎么合并索引他访问方法之间进行选择 。
Index Merge Intersection算法
Index Merge Intersection算法对所有使用的索引执行同步扫描 , 并生成从合并的索引扫描接收到的行序列的交集 。
这种算法适用于当WHERE子句被转换成多个使用AND连接的不同索引key上的范围条件,且条件是以下两种之一:
一、这种形式的N部分表达式,索引正好包括N个字段(所有索引字段都被覆盖),N=1,N如果大于1就是复合索引:
二、InnoDB表主键上的任何范围条件 。
例子:
Index Merge Union算法
该算法类似于Index Merge Intersection算法,适用于当WHERE子句被转换成多个使用OR连接的不同索引key上的范围条件,且条件是以下三种之一:
一、这种形式的N部分表达式,索引正好包括N个字段(所有索引字段都被覆盖),N=1,N如果大于1就是复合索引:
二、InnoDB表主键上的任何范围条件 。
三、符合Index Merge Intersection算法的条件 。
例子:
Index Merge Sort-Union算法
该算法适用于当WHERE子句被转换成多个使用OR连接的不同索引key上的范围条件,但是不符合 Index Merge Union算法的 。Index Merge Sort-Union和Index Merge Union算法的区别在于,Index Merge Sort-Union必须首先获取所有行的行id并在返回任何行之前对它们进行排序 。
例子:
有好的建议,请在下方输入你的评论 。
欢迎访问个人博客
mysql怎么合并索引的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Mysql怎么用索引、mysql怎么合并索引的信息别忘了在本站进行查找喔 。

    推荐阅读