精华内容
下载资源
问答
  • 创建普通索引的时候,指定两个或更多的字段这就是联合索引,语法如下alter table add index 索引名(字段1,字段2)维护数据库时发现现索引重复了?这时可以删掉重复的索引,释放内存空间,提高查询效率#因为联合...

    单字段索引不能满足你了,那就多来几个...

    创建普通索引的时候,指定两个或更多的字段
    这就是联合索引,语法如下

    alter table  add index 索引名(字段1,字段2)

    维护数据库时发现现索引重复了?

    这时可以删掉重复的索引,释放内存空间,提高查询效率

    #因为联合索引(A,B)相当于创建了(A)和(A,B)索引  KEY idx_Id (Id)  KEY idx_Id_age (Id, age)  #所以这里可以删除Id 这个索引;

    使用联合索引时,注意索引列的顺序,要遵循 最左匹配原则

    联合索引 "idx_id_age " id在前,age在后  #符合最左匹配原则select * from user where id=10 and age =10#符合最左匹配原则select * from user where id =10;#age在前就不符合最左匹配原则,即不会用到索引select * from user where age =10 and id =10;

    当我们创建一个联合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。

    如果遇到了范围查询,比如()和 between 等,
    会停止匹配,那后面的列就不会用到联合索引了。

    where k1 > 1 AND  k2  = 2   AND  k3 = 3#这里k1 使用了范围查询,所以后面的k2,和k3 列就不会使用到联合索引了

    这里有几条SQL语句,说说它们分别用到了哪个索引呢?

    1.SELECT x, y, z FROM table WHERE y=2 AND x>1 AND z=32.SELECT x, y, z FROM table WHERE y=2 AND x=1 AND z>33.SELECT x, y, z FROM table WHERE y=2 AND x=1 AND z=34.SELECT x, y, z FROM table WHERE y>2 AND x=1 AND z=3

    结果是 : 这四条语句都会用到索引!!

    1: WHERE y=2 AND x>1 AND z=3 -- 使用索引(x,y,z)的x列。#x是范围列,索引列最多作用于一个范围列,范围列之后的y列和z列无法使用索引。2: WHERE y=2 AND x=1 AND z>3 -- 完整使用索引(x,y,z)。3: WHERE y=2 AND x=1 AND z=3 -- 完整使用索引(x,y,z)。4: WHERE y>2 AND x=1 AND z=3 -- 使用索引(x,y,z)的x列和y列。#y是范围列,索引列最多作用于一个范围列,范围列之后的z列无法使用索引。

    最后邀你进群一起学习
    关注公众号 技能锦囊
    后台回复 SQL

    8a3e6cc1abbeb8dcc8b8169484593e85.png长按关注

    by~

    展开全文
  • 多个单列索引联合索引的区别详解

    万次阅读 多人点赞 2018-06-24 17:40:58
    那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。 一、联合索引测试 注:Mysql版本为 5.7.20 创建测试(记录...

    背景:
    为了提高数据库效率,建索引是家常便饭;那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。


    一、联合索引测试

    注:Mysql版本为 5.7.20

    创建测试表(表记录数为63188):

    CREATE TABLE `t_mobilesms_11` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `userId` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT '用户id,创建任务时的userid',
      `mobile` varchar(24) NOT NULL DEFAULT '' COMMENT '手机号码',
      `billMonth` varchar(32) DEFAULT NULL COMMENT '账单月',
      `time` varchar(32) DEFAULT NULL COMMENT '收/发短信时间',
      `peerNumber` varchar(64) NOT NULL COMMENT '对方号码',
      `location` varchar(64) DEFAULT NULL COMMENT '通信地(自己的)',
      `sendType` varchar(16) DEFAULT NULL COMMENT 'SEND-发送; RECEIVE-收取',
      `msgType` varchar(8) DEFAULT NULL COMMENT 'SMS-短信; MSS-彩信',
      `serviceName` varchar(256) DEFAULT NULL COMMENT '业务名称. e.g. 点对点(网内)',
      `fee` int(11) DEFAULT NULL COMMENT '通信费(单位分)',
      `createTime` datetime DEFAULT NULL COMMENT '创建时间',
      `lastModifyTime` datetime DEFAULT NULL COMMENT '最后修改时间',
      PRIMARY KEY (`id`),
      KEY `联合索引` (`userId`,`mobile`,`billMonth`)
    ) ENGINE=InnoDB AUTO_INCREMENT=71185 DEFAULT CHARSET=utf8 COMMENT='手机短信详情'
    

    我们为userId, mobile, billMonth三个字段添加上联合索引!

    我们选择 explain 查看执行计划来观察索引利用情况:


    1.查询条件为 userid

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE userid='2222'
    

    这里写图片描述

    可以通过key看到,联合索引有效


    2.查询条件为 mobile

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE mobile='13281899972'
    

    这里写图片描述
    可以看到联合索引无效


    3.查询条件为 billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE billMonth='2018-04'
    

    这里写图片描述
    联合索引无效


    4.查询条件为 userid and mobile

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE userid='2222' AND mobile='13281899972'
    

    这里写图片描述
    联合索引有效


    5.查询条件为 mobile and userid

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  mobile='13281899972' AND userid='2222' 
    

    这里写图片描述
    在4的基础上调换了查询条件的顺序,发现联合索引依旧有效


    6.查询条件为 userid or mobile

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE userid='2222' OR mobile='13281899972'
    

    这里写图片描述
    and 换成 or,发现联合所索引无效


    7.查询条件为 userid and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE userid='2222' AND billMonth='2018-04'
    

    这里写图片描述
    这两个条件分别位于联合索引位置的第一和第三,测试联合索引依旧有效


    8.查询条件为 mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE mobile='13281899972' AND billMonth='2018-04'
    

    这里写图片描述
    这两个条件分别位于联合索引位置的第二和第三,发现联合索引无效


    9.查询条件为 userid and mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  userid='2222' AND mobile='13281899972' AND billMonth='2018-04'
    

    这里写图片描述
    所有条件一起查询,联合索引有效!(当然,这才是最正统的用法啊!)


    二、单列索引测试

    创建三个单列索引:
    这里写图片描述

    1.查询条件为 userid and mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  userid='2222' AND mobile='13281899972' AND billMonth='2018-04'
    

    这里写图片描述
    我们发现三个单列索引只有 userid 有效(位置为查询条件第一个),其他两个都没有用上。

    那么为什么没有用上呢?按照我们的理解,三个字段都加索引了,无论怎么排列组合查询,应该都能利用到这三个索引才对!

    其实这里其实涉及到了mysql优化器的优化策略!当多条件联合查询时,优化器会评估用哪个条件的索引效率最高!它会选择最佳的索引去使用,也就是说,此处userid 、mobile 、billMonth这三个索引列都能用,只不过优化器判断使用userid这一个索引能最高效完成本次查询,故最终explain展示的key为userid。


    2.查询条件为 mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE mobile='13281899972' AND billMonth='2018-04'
    

    这里写图片描述
    我们发现此处两个查询条件只有 mobile 生效(位置也为查询条件第一个)


    3.查询条件为 userid or mobile

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  userid='2222' OR mobile='13281899972' 
    

    这里写图片描述
    这次把 and 换成 or,发现两个查询条件都用上索引了!

    我们在网上可能常常看到有人说or会导致索引失效,其实这并不准确。而且我们首先需要判断用的是哪个数据库哪个版本,什么引擎?

    比如我用的是mysql5.7版本,innodb引擎,在这个环境下我们再去讨论索引的具体问题。

    关于or查询的真相是:
    所谓的索引失效指的是:假如or连接的俩个查询条件字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描。我们从or的基本含义出发应该能理解并认可这种说法,没啥问题。

    此刻需要注意type类型为index_merge
    我查资料说mysql 5.0 版本之前 使用or只会用到一个索引(即使如上我给userid和mobile都建立的单列索引),但自从5.0版本开始引入了index_merge索引合并优化!也就是说,我们现在可以利用上多个索引去优化or查询了。

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

    index_merge应用场景:

    1.对OR语句求并集,如查询SELECT * FROM TB1 WHERE c1="xxx" OR c2=""xxx"时,如果c1和c2列上分别有索引,可以按照c1和c2条件进行查询,再将查询结果合并(union)操作,得到最终结果

    2.对AND语句求交集,如查询SELECT * FROM TB1 WHERE c1="xxx" AND c2=""xxx"时,如果c1和c2列上分别有索引,可以按照c1和c2条件进行查询,再将查询结果取交集(intersect)操作,得到最终结果

    3.对AND和OR组合语句求结果


    三、结论

    通俗理解:
    利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处

    所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用仅对后面的任意列执行搜索时,复合索引则没有用处。


    重点:

    多个单列索引多条件查询时优化器会选择最优索引策略可能只用一个索引,也可能将多个索引全用上! 但多个单列索引底层会建立多个B+索引树,比较占用空间,也会浪费一定搜索效率,故如果只有多条件联合查询时最好建联合索引!


    最左前缀原则:

    顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上,
    注:如果第一个字段是范围查询需要单独建一个索引
    注:在创建联合索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。这样的话扩展性较好,比如 userid 经常需要作为查询条件,而 mobile 不常常用,则需要把 userid 放在联合索引的第一位置,即最左边


    同时存在联合索引和单列索引(字段有重复的),这个时候查询mysql会怎么用索引呢?

    这个涉及到mysql本身的查询优化器策略了,当一个表有多条索引可走时, Mysql 根据查询语句的成本来选择走哪条索引;


    有人说where查询是按照从左到右的顺序,所以筛选力度大的条件尽量放前面。网上百度过,很多都是这种说法,但是据我研究,mysql执行优化器会对其进行优化当不考虑索引时,where条件顺序对效率没有影响真正有影响的是是否用到了索引


    联合索引本质:

    当创建**(a,b,c)联合索引时,相当于创建了(a)单列索引**,(a,b)联合索引以及**(a,b,c)联合索引**
    想要索引生效的话,只能使用 a和a,b和a,b,c三种组合;当然,我们上面测试过,a,c组合也可以,但实际上只用到了a的索引,c并没有用到!
    注:这个可以结合上边的 通俗理解 来思考!


    其他知识点:

    1、需要加索引的字段,要在where条件中
    2、数据量少的字段不需要加索引;因为建索引有一定开销,如果数据量小则没必要建索引(速度反而慢)
    3、避免在where子句中使用or来连接条件,因为如果俩个字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描
    4、联合索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。另外建立多列索引时,顺序也是需要注意的,应该将严格的索引放在前面,这样筛选的力度会更大,效率更高


    最后的说明:

    网上关于索引优化等文章太多了,针对各个数据库各个版本各种引擎都可能存在不一样的说法

    我们的SQL引擎自带的优化也越来越强大,说不定你的某个SQL优化认知,其SQL引擎在某次升级中早就自优化了。

    所以要么跟进官方文档,要么关注数据库大牛的最新文章,要么在现有数据库环境下自己去亲手测试!

    数据库领域的水很深。。大家加油。。共勉 ~

    展开全文
  • mysql建立联合索引有最左前置原则,在建立联合索引时,根据需求,where子句中使用最频繁的一列放在最左边; 如何理解联合索引中遵守的最左前置原则? mysql默认的存储引擎是InnoDB,InnoDB使用B+树,B+树的数据项...

    今天听了Andy老师的MySQL课程,学习到了一点知识,来做一下笔记~

     



    建立联合索引时,为什么要关注列的顺序?

    mysql建立联合索引有最左前置原则,在建立联合索引时,根据需求,where子句中使用最频繁的一列放在最左边;


    如何理解联合索引中遵守的最左前置原则?

    mysql默认的存储引擎是InnoDB,InnoDB使用B+树,B+树的数据项是复合的数据结构,是按照从左到右的顺序来建立搜索树的。

    比如当(AA,BB,CC)这样的数据来检索的时候,b+树会优先比较AA来确定下一步的所搜方向,如果AA相同再依次比较BB和CC,最后得到检索的数据;

    但当(BB,CC)这样的没有AA的数据来的时候,b+树就不知道第一步该查哪个节点,因为建立搜索树的时候AA就是第一个比较因子,必须要先根据AA来搜索才能知道下一步去哪里查询。

    当(AA,CC)这样的数据来检索时,b+树可以用AA来指定搜索方向,但下一个字段BB的缺失,所以只能把名字等于AA的数据都找到,然后再匹配CC这种情况无法用到联合索引。

     



    什么是回表操作,索引覆盖的意义?


    回表操作:执行一条sql语句,需要从两个b+树中取数据。

    比如:建立了一个A,B联合索引,sql语句是 select A,B from table where A=?, B=?,此时想要搜索的A,B从索引数据中已经存在了,不用拿到id到表数据中去查找,此时便不会回表,这种现象就叫做索引覆盖。

    现在把语句改为了 select A,B,C from table where A=?, B=?,C不在索引数据中,所以只能先拿到id再到表数据文件中搜索,这就是回表。


    覆盖索引就是从索引中直接获取查询结果,要使用覆盖索引需要注意select查询列中包含在索引列中,MySQL使用了覆盖索引进行查询。查询效率得到极大的提升。


     

    mysql里创建‘联合索引’的意义?

    1. "一个顶三个"。建了一个(a,b,c)的复合索引,那么实际等于建了(a),(a,b),(a,b,c)三个索引,因为每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,这可是不小的开销!
    2. 覆盖索引。同样的有复合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=1 and b = 1。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一
    3. 索引列越多,通过索引筛选出的数据越少。有1000W条数据的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W*10%=100w 条数据,然后再回表从100w条数据中找到符合b=2 and c= 3的数据,然后再排序,再分页;如果是复合索引,通过索引筛选出1000w *10% *10% *10%=1w,然后再排序、分页,哪个更高效,一眼便知

     

    展开全文
  • 作者:深寒丶来源:blog.csdn.net/abysscarry/article/details/80792876背景:为了提高数据库效率,建索引是家常便饭;...一、联合索引测试注:Mysql 版本为 5.7.20创建测试(记录数为 63188)...

    作者:深寒丶

    来源:blog.csdn.net/abysscarry/article/details/80792876

    背景:为了提高数据库效率,建索引是家常便饭;那么当查询条件为 2 个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。

    一、联合索引测试

    注:Mysql 版本为 5.7.20

    创建测试表(表记录数为 63188):

    CREATE 

    我们为userId, mobile, billMonth三个字段添加上联合索引!

    我们选择 explain 查看执行计划来观察索引利用情况:

    1.查询条件为 userid

    EXPLAIN 
    ba32ec790b7befa354554f22ed95eabf.png

    可以通过key看到,联合索引有效

    2.查询条件为 mobile

    EXPLAIN 
    5f2aa56a36524e5de89383627863c3e7.png

    可以看到联合索引无效

    3.查询条件为 billMonth

    EXPLAIN 
    19b9d7235120572e3f2fb0a17fe20494.png

    联合索引无效

    4.查询条件为 userid and mobile

    EXPLAIN 
    7b67cfeb4fee05dc367c590f801c8beb.png

    联合索引有效

    5.查询条件为 mobile and userid

    EXPLAIN 
    610a3b5bde5f351fd9883d94e0eafe0e.png

    在 4 的基础上调换了查询条件的顺序,发现联合索引依旧有效

    6.查询条件为 userid or mobile

    EXPLAIN 
    0ddbc53e7e669268b45509d0e65e8edc.png

    and 换成 or,发现联合所索引无效

    7.查询条件为 userid and billMonth

    EXPLAIN 
    649363a3aa3e9b8ee3f630ab92a68cfc.png

    这两个条件分别位于联合索引位置的第一和第三,测试联合索引依旧有效

    8.查询条件为 mobile and billMonth

    EXPLAIN 
    06f38b67c221b5215e484180a64ca6a0.png

    这两个条件分别位于联合索引位置的第二和第三,发现联合索引无效

    9.查询条件为 userid and mobile and billMonth

    EXPLAIN 
    34cf261ccd85b09850d65e0952b34cec.png

    所有条件一起查询,联合索引有效!(当然,这才是最正统的用法啊!)

    二、单列索引测试

    创建三个单列索引:

    de321db4dcceb9dbdca20b29e512738e.png

    1.查询条件为 userid and mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  userid='2222' AND mobile='13281899972' AND billMonth='2018-04'
    624287fcc4110dcd6e779190784088a0.png

    我们发现三个单列索引只有 userid 有效(位置为查询条件第一个),其他两个都没有用上。

    那么为什么没有用上呢?按照我们的理解,三个字段都加索引了,无论怎么排列组合查询,应该都能利用到这三个索引才对!

    其实这里其实涉及到了 mysql 优化器的优化策略!当多条件联合查询时,优化器会评估用哪个条件的索引效率最高!它会选择最佳的索引去使用,也就是说,此处userid 、mobile 、billMonth这三个索引列都能用,只不过优化器判断只需要使用userid这一个索引就能完成本次查询,故最终 explain 展示的 key 为 userid。

    当然,如果优化器判断本次查询非要全使用三个索引才能效率最高,那么 explain 的 key 就会是userid 、mobile 、billMonth,都会生效!

    2.查询条件为 mobile and billMonth

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE mobile='13281899972' AND billMonth='2018-04'
    fbf91694e03e41ad9bd4f3a4d871631c.png

    我们发现此处两个查询条件只有 mobile 生效(位置也为查询条件第一个)

    3.查询条件为 userid or mobile

    EXPLAIN SELECT * FROM `t_mobilesms_11` WHERE  userid='2222' OR mobile='13281899972'
    cd2f59dc8339b38f48ee9c63a89de593.png

    这次把 and 换成 or,发现两个查询条件都用上索引了!

    我们在网上可能常常看到有人说 or 会导致索引失效,其实这并不准确。而且我们首先需要判断用的是哪个数据库哪个版本,什么引擎?

    比如我用的是 mysql5.7 版本,innodb 引擎,在这个环境下我们再去讨论索引的具体问题。

    关于 or 查询的真相是:

    所谓的索引失效指的是:假如 or 连接的俩个查询条件字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描。我们从 or 的基本含义出发应该能理解并认可这种说法,没啥问题。

    此刻需要注意type类型为index_merge

    我查资料说 mysql 5.0 版本之前 使用 or只会用到一个索引(即使如上我给 userid 和 mobile 都建立的单列索引),但自从 5.0 版本开始引入了index_merge 索引合并优化!也就是说,我们现在可以利用上多个索引去优化 or 查询了。

    index_merge 作用:

    1、索引合并是把几个索引的范围扫描合并成一个索引。

    2、索引合并的时候,会对索引进行并集,交集或者先交集再并集操作,以便合并成一个索引。

    3、这些需要合并的索引只能是一个表的。不能对多表进行索引合并。

    index_merge 应用场景:

    1.对 OR 语句求并集,如查询SELECT * FROM TB1 WHERE c1="xxx" OR c2=""xxx"时,如果 c1 和 c2 列上分别有索引,可以按照 c1 和 c2 条件进行查询,再将查询结果合并(union)操作,得到最终结果

    2.对 AND 语句求交集,如查询SELECT * FROM TB1 WHERE c1="xxx" AND c2=""xxx"时,如果 c1 和 c2 列上分别有索引,可以按照 c1 和 c2 条件进行查询,再将查询结果取交集(intersect)操作,得到最终结果

    3.对 AND 和 OR 组合语句求结果

    三、结论

    通俗理解:

    利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处

    所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用仅对后面的任意列执行搜索时,复合索引则没有用处。

    重点:

    多个单列索引多条件查询时优化器会选择最优索引策略可能只用一个索引,也可能将多个索引全用上! 但多个单列索引底层会建立多个 B+索引树,比较占用空间,也会浪费一定搜索效率,故如果只有多条件联合查询时最好建联合索引!

    最左前缀原则:

    顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上, 注:如果第一个字段是范围查询需要单独建一个索引注:在创建联合索引时,要根据业务需求,where 子句中使用最频繁的一列放在最左边。这样的话扩展性较好,比如 userid 经常需要作为查询条件,而 mobile 不常常用,则需要把 userid 放在联合索引的第一位置,即最左边

    同时存在联合索引和单列索引(字段有重复的),这个时候查询 mysql 会怎么用索引呢?

    这个涉及到 mysql 本身的查询优化器策略了,当一个表有多条索引可走时, Mysql 根据查询语句的成本来选择走哪条索引;

    有人说 where 查询是按照从左到右的顺序,所以筛选力度大的条件尽量放前面。网上百度过,很多都是这种说法,但是据我研究,mysql 执行优化器会对其进行优化当不考虑索引时,where 条件顺序对效率没有影响真正有影响的是是否用到了索引

    联合索引本质:

    当创建**(a,b,c)联合索引时,相当于创建了(a)单列索引**,(a,b)联合索引以及**(a,b,c)联合索引** 想要索引生效的话,只能使用 a 和 a,b 和 a,b,c 三种组合;当然,我们上面测试过,a,c 组合也可以,但实际上只用到了 a 的索引,c 并没有用到!注:这个可以结合上边的 通俗理解 来思考!

    其他知识点:

    1、需要加索引的字段,要在 where 条件中

    2、数据量少的字段不需要加索引;因为建索引有一定开销,如果数据量小则没必要建索引(速度反而慢)

    3、避免在 where 子句中使用or来连接条件,因为如果俩个字段中有一个没有索引的话,引擎会放弃索引而产生全表扫描

    4、联合索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。另外建立多列索引时,顺序也是需要注意的,应该将严格的索引放在前面,这样筛选的力度会更大,效率更高

    最后的说明:

    网上关于索引优化等文章太多了,针对各个数据库各个版本各种引擎都可能存在不一样的说法

    我们的 SQL 引擎自带的优化也越来越强大,说不定你的某个 SQL 优化认知,其 SQL 引擎在某次升级中早就自优化了。

    所以要么跟进官方文档,要么关注数据库大牛的最新文章,要么在现有数据库环境下自己去亲手测试!

    数据库领域的水很深。。大家加油。。共勉 ~

    -End-

    加小编微信:xiaobaito,免费获取一份架构师资料。还可以邀请加入咱们的菜鸟架构技术群一起讨论技术,禁止发广告及垃圾信息哦。

    热门阅读

    免费获取一份架构资料!Zookeeper面试23连问,你顶得住吗?Java 程序员必须掌握的 10 款开源工具!如何干掉恶心的 SQL 注入?超级全面的权限系统设计方案面世了MySQL 这三道必问面试题,你都会吗?爱奇艺的 "数据库" 选型到底有多牛逼?免费版的 IDEA 为啥不能使用 Tomcat ?

    更多请关注“菜鸟架构”公众号,将不断呈现更多架构干货!

    9fd1fa746a7e144451979cc50886a490.png

    给个在看,谢谢老板!

    展开全文
  • 联合索引创建方法跟单个索引创建方法一样,不同之处仅在于有多个索引列。 开讲之前我们先弄一张学生数据如下: 下面我们给出一个需求:查询中以字母"L"开头的姓名及年龄。 1、常规的写法
  • MySQL联合索引

    万次阅读 2020-06-02 22:31:35
    联合索引又叫复合索引,即一个覆盖中两列或者以上的索引,例如: index_name(column a,column b) 1 创建方式 执行alter table语句时创建 alter table table_name add index index_name(column_list) 1 index_name...
  • 联合索引

    2020-06-16 15:08:42
    联合索引(各种索引) 聚集索引和非聚集索引 数据库中B+树索引可以分为聚集索引和非聚集索引(辅助索引) 聚集索引 每张只有一个聚集索引,且是建立在主键上面的。...联合索引上的多个列...
  • #无索引:mysql根本就不知道到底是否存在id等于333333333的记录,只能把数据从头到尾扫描一遍, # 此时有多少个磁盘块就需要进行多少IO操作,所以查询速度很慢 mysql> select * from s1 where id=333333333; ...
  • mysql添加联合唯一索引

    千次阅读 2016-06-08 17:49:08
    在开发过程中遇到了联合索引的问题,现在总结一下: 开发具体环境是这样的:我们有一个行业中包含省份和城市两个字段。因此需要针对这两个字段建立联合索引名称为:sc_blacklistcity 两个字段分别为:...
  • MySql创建联合索引

    万次阅读 2018-05-31 18:08:38
    首先创建一个:create table t1 ...创建单个索引的语法:create index 索引名 on 表名(字段名)索引名一般是:表名_字段名给id创建索引:create index t1_id on t1(id);创建联合索引的语法:create index 索引名...
  • CREATE TABLE IF NOT EXISTS `表名`( `id` INT...KEY (`device_id`,`time`) #设置device_id,time为联合索引 foreign key (`device_id`) references device(`id`) #foreign key (字段名) references 外表名(外表名id)
  • 全文索引----创建solr索引

    万次阅读 热门讨论 2016-05-07 21:10:39
    这片文章介绍下如何基于多个数据表创建索引。  一 无关联多表创建索引  1.1 数据库准备    我们使用任意的两个作为数据源,这两个可以属于一个数据库,也可以属于不同的数据库,如果使用两个数据库,则...
  • 通过图文给大家介绍了关于MySQL中两关联的连接如何创建索引的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
  • 数据库索引怎么,什么时候用到 索引优缺点:为主键外where子句建立索引可以加速数据库查询,但是...)如果一张的数据量很大而符合条件的结果又很少,那么不加索引会引起致命性的结果下降,每次查找一条特定的数据...
  • 联合索引(复合索引)和单个索引

    千次阅读 2019-02-23 15:56:41
    那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下。 一、联合索引测试 注:Mysql版本为 5.7.20 创建测试(记录数...
  • 、覆盖索引联合索引、最左前缀 匹配原则、索引下推 1.创建一张, 并插入记录 create table user( -> id int not null auto_increment, -> name char(16) not null, -> age int not null, -> ...
  • 复合主键与联合主键、索引联合(复合)索引

    万次阅读 多人点赞 2018-09-24 22:11:31
    前几天面试时被问到了MySql中联合索引使用与生效问题;回来顺便看了一下复合主键与联合主键,查漏补缺,慢慢学习吧。 一、复合主键与联合主键 1、复合主键:指的主键含有一个以上的字段组成,不使用无业务含义的...
  • 一、什么是回查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) ...InnoDB聚集索引和普通索引...(1)如果定义了PK,则PK就是聚集索引; (2...
  • mysql联合索引索引优化的理解

    千次阅读 2018-11-16 18:45:59
    首先介绍联合索引的最左原则,即假设某张表test,有四个字段,id,a,b,c;id是主键,a和b是联合索引,建表和值如下: CREATE TABLE `test` ( `id` int(11) NOT NULL, `a` varchar(32) NOT NULL DEFAULT '', `...
  • mysql联合索引

    千次阅读 2018-08-04 16:09:58
    联合索引又叫复合索引,即一个覆盖中两列或者以上的索引 ,例如:index (column a,column b)。 1.2创建方式 1.2.1执行alter table语句时创建 alter table table_name add index index—name(column_list) ...
  • mysql 创建索引联合索引)

    千次阅读 2014-08-19 17:47:59
    1、创建索引 alter table ssp.ssp_web_report add unique index(date_id,website_id,slot_id); alter ignore table ssp.ssp_web_report add unique index(date_id,website_id,slot_id);
  • 1、覆盖索引:如果查询条件使用的是普通索引(或是联合索引的最左原则字段),查询结果是联合索引的字段或是主键,不用回操作,直接返回结果,减少IO磁盘读写读取正行数据 2、最左前缀:联合索引的最左 N 个字段...
  • 联合索引的树结构、最左匹配原则、如何选择合适的索引列顺序、索引下推图文讲解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,705
精华内容 33,082
关键字:

联合表建索引