首页
学习
活动
专区
圈层
工具
发布

MySQL 联合索引

1.简介 联合索引指建立在多个列上的索引。 MySQL 可以创建联合索引(即多列上的索引)。一个索引最多可以包含 16 列。...联合索引可以测试包含索引中所有列的查询,或仅测试第一列、前两列、前三列等等的查询。如果在索引定义中以正确的顺序指定列,则复合索引可以加快对同一表的多种查询的速度。 下面是一个联合索引的例子。...3.最左匹配原理 最左匹配是针对联合索引来说的,所以我们可以从联合索引的原理来了解最左匹配。...我们都知道索引的底层是一颗 B+ 树,那么联合索引当然也是一颗 B+ 树,只不过联合索引的键值不是一个,而是多个。...参考文献 8.3.1 How MySQL Uses Indexes - MySQL 8.3.6 Multiple-Column Indexes - MySQL 面试官:谈谈你对mysql联合索引的认识

1.6K20

mysql联合索引详解

上一篇文章:mysql数据库索引优化 比较简单的是单列索引(b+tree)。遇到多条件查询时,不可避免会使用到多列索引。联合索引又叫复合索引。...b+tree结构如下: 每一个磁盘块在mysql中是一个页,页大小是固定的,mysql innodb的默认的页大小是16k,每个索引会分配在页上的数量是由字段的大小决定。...以下通过例子分析索引的使用情况,以便于更好的理解联合索引的查询方式和使用范围。 一、多列索引在and查询中应用 select * from test where a=? and b=? and c=?...;经过mysql的查询分析器的优化,索引覆盖a和b。 select * from test where a=?;索引覆盖a。 select * from test where b=? and c=?...四,总结 联合索引的使用在写where条件的顺序无关,mysql查询分析会进行优化而使用索引。但是减轻查询分析器的压力,最好和索引的从左到右的顺序一致。

10.2K90
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

    audit_time在左边的联合索引,没有关于status的索引。...分析上面的sql执行的逻辑: 从联合索引里找到所有小于该审核时间的主键id(假如在该时间戳之前已经审核了100万条数据,则会在联合索引里取出对应的100万条数据的主键 id) 未来如果有一个优化就好了,...图中我按照索引存储规律来YY伪造填充了一些数据,如有不对请留言指出。希望通过这张图大家能够看到联合索引存储的方式和索引查询的方式 ?...改进思路 1 范围查找向来不太好使用好索引的,如果我们增加一个audit_time, status的联合索引,会有哪些改进呢?...还是分析下在添加了该索引之后的执行过程: 从联合索引里找到小于该审核时间的audit_time最大的一行的联合索引 然后依次往下找,因为索引的值是分散的。

    77420

    Mysql索引使用案例分析

    Mysql索引使用案例分析 1 Index Design 1.1 设计过程 考察只用排序 还是 先检索在排序(排序会限制索引使用)。 考察哪些列选择性更好,哪些列在where中最多。...例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表 mysql> explain select max(k) from sbtest1\G ********************...768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。...Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。...Using filesort:mysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。

    2.7K20

    MySQL覆盖索引的使用案例

    在使用覆盖索引时,执行计划的Extra字段中有Using index的信息,下面是一个SQL语句的执行计划: mysql>explain select customer_id,inventory_id,...,而且没有访问表,查询rental_date索引的构成: mysql> select column_name from information_schema.statistics where index_name...由于二级索引实质上都包含主键,因此如果再加上主键,一样可以使用覆盖索引,下面是在输出字段中加上主键字段的SQL语句的执行计划: mysql>explain select rental_id,customer_id...但如果要访问的字段不在这个索引中,则还需要访问表,如果在上面的查询字段中再增加任意一个其他字段就不能使用覆盖索引了,例如下面的SQL语句将无法使用覆盖索引: mysql>explain select *...但可以对这个SQL语句进行改写,先用一个可以使用覆盖索引的子查询查询出主键,再通过主键查找相应的记录,这种方法称之为延迟关联(deferred join),改写后的SQL语句执行计划如下: mysql>

    29810

    MySQL案例:全文索引浅析

    前言 所谓全文索引,就是一种通过建立倒排索引,快速匹配文档内容的方式。和B+树索引一样,倒排索引也是一种索引结构,一个倒排索引是由文档中所有不重复的分词和其所在文档的映射组成。...(1:1),(3:1) 2 are (1:2),(3:2) 3 you (1:3),(3:3) 4 fine (2:1),(4:1) 5 thanks (2:2),(4:2) 实现原理 辅助表 在MySQL...mysql> CREATE TABLE opening_lines ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,...mysql> set GLOBAL innodb_optimize_fulltext_only=ON; Query OK, 0 rows affected (0.01 sec) mysql> OPTIMIZE...,能够大大加快查询速度;但是,MySQL的全文索引还是具有很大的局限性,比如不支持指定分词的分隔符(默认为空格),ngram分析器可以指定固定长度分词,但实用性仍然较差。

    4.1K110

    MySQL 索引优化分析案例

    索引优化分析案例 预先准备好数据 SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `itdragon_order_list`; CREATE TABLE `...20.18', '20.17', '1', '10', 'ok', 'ok', 'auto', '1', 'itdragon', '2017-09-08 17:01:49'); 逐步开始进行优化: 第一个案例...create unique index idx_order_transaID on itdragon_order_list (transaction_id); --当创建索引之后,唯一索引对应的type...是const,通过索引一次就可以找到结果,普通索引对应的type是ref,表示非唯一性索引赛秒,找到值还要进行扫描,直到将索引文件扫描完为止,显而易见,const的性能要高于ref explain select...= "81X97310V32236260E"; 第二个案例 --创建复合索引 create index idx_order_levelDate on itdragon_order_list (order_level

    64210

    Mysql性能优化案例 - 覆盖索引

    使用了user_id的索引,并且是const常数查找,表示性能已经很好了 优化后 因为这个语句太简单,sql本身没有什么优化空间,就考虑了索引 修改索引结构,建立一个(user_id,picname...,smallimg)的联合索引:uid_pic 重新执行10次,平均耗时降到了30ms左右 使用explain进行分析 ?...看到使用的索引变成了刚刚建立的联合索引,并且Extra部分显示使用了'Using Index' 总结 'Using Index'的意思是“覆盖索引”,它是使上面sql性能提升的关键 一个包含查询所需字段的索引称为...“覆盖索引” MySQL只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少IO,提高了效率 例如上面的sql,查询条件是user_id,可以使用联合索引,要查询的字段是...picname smallimg,这两个字段也在联合索引中,这就实现了“覆盖索引”,可以根据这个联合索引一次性完成查询工作,所以提升了性能

    1.6K50

    3.联合索引、覆盖索引及最左匹配原则|MySQL索引学习

    导语 在数据检索的过程中,经常会有多个列的匹配需求,今天介绍下联合索引的使用以及最左匹配原则的案例。...最左匹配原则作用在联合索引中,假如表中有一个联合索引(tcol01,tcol02,tcol03),只有当SQL使用到tcol01、tcol02索引的前提下,tcol03的索引才会被使用;同理只有tcol01...如下图: image.png 索引最左原则案例 情况1:三个索引都能使用上 实验1:仅有where子句 # 三个条件都使用上,优化器可以自己调整顺序满足索引要求 [root@GreatSQL][test...每个索引都会占用写入开销和磁盘开销,对于大量数据的表,使用联合索引会大大的减少开销。 2.覆盖索引。...tcol02=50; 2.创建联合索引的时候,要将区分度高的字段放在前面,假如有一张学生表包含学号和姓名,那么在建立联合索引的时候,学号放在姓名前面,因为学号是唯一性的,能过滤更多的数据。

    2.1K10

    MySQL - 索引优化案例实操

    BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='员工记录表'; 重点 主键id PRIMARY KEY (id) 联合索引...---- Case 1 : 联合索引第一个字段用范围不一定会走索引 ?...> 当然了,也不是所有的情况都不走索引, MySQL会基于Cost选择一个合适的 ,如果没有走索引,可能mysql内部可能觉得第一个字段就用范围,结果集应该很大,回表效率不高,还不如就全表扫描 如果没有走索引想要去优化的话怎么办呢...name , age , position 是联合索引,在索引树上,同时索引树上的叶子节点还会关联一个主键id , 如果查询 * 的话,还要根据id去主键索引上去查找其他字段,需要回表, 如果仅查询二级索引树...就几条数据的话, 结合B+树的结构, MySQL认为从根节点开始向下找,还不如直接从叶子节点从头开始扫描快呢 ---- Case 3 : like KK% 一般情况都会走索引 结合索引树 , like

    71030

    MySQL中的联合索引、覆盖索引及最左匹配原则

    叶老师的GreatSQL社区的这篇文章《3.联合索引、覆盖索引及最左匹配原则|MySQL索引学习》,不仅适用于GreatSQL、MySQL,从原理层,对Oracle等数据库同样是通用的。...在数据检索的过程中,经常会有多个列的匹配需求,接下来给出一些联合索引的使用以及最左匹配原则的案例。...最左匹配原则作用在联合索引中,假如表中有一个联合索引(tcol01, tcol02, tcol03),只有当SQL使用到tcol01、tcol02索引的前提下,tcol03的索引才会被使用,同理只有tcol01...索引最左原则案例 情况1,三个索引都能使用上 实验1,仅有where子句, # 三个条件都使用上,优化器可以自己调整顺序满足索引要求 [root@GreatSQL][test]>explain SELECT...每个索引都会占用写入开销和磁盘开销,对于大量数据的表,使用联合索引会大大的减少开销。 (2) 覆盖索引。

    5K31

    MySQL 联合索引底层存储结构及索引查找过程解读

    联合索引的列顺序非常重要,因为查询优化器会按照索引列的顺序执行搜索。本文将从联合索引基本概念、底层存储结构、索引查找过程、实践建议几个方面图文并茂进行详细介绍。...“merchant_id_order_id_union_index” 的底层存储结构(不一定和 MySQL 数据库底层实现完全一致),我们可以看到除了具有单列索引的特点外,联合索引还具有以下一些特点:...建议能使用联合索引尽量使用联合索引应该尽可能使用联合索引,但联合索引无法满足需求时可以结合单列索引使用。...联合索引中字段范围查询为什么会导致后续联合索引字段可不用从联合索引的底层存储结构我们可以知道,叶子节点数据局部有序,下面的案例可以清楚饿展示这个问题:假设存在如下数据:1(b=1,c=4,d = 10)...在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。

    5K30

    死锁案例--(添加联合索引和复合索引,以及添加普通索引使其走二级索引)

    因为无法通过索引确定主键,导致MySQL Server会先尝试锁定当前dead_lock_test表中所有记录添加记录锁(可以设置参数进行优化,根据where条件逐渐解除不满足条件记录上的记录锁)。...4 解决方案4.1 添加索引由上述的分析可知,删除时因为where条件无法利用索引,导致MySQL会尝试对表中所有记录加记录锁,产生死锁。我们仅需在v1以及v2字段上建立联合索引,缩小记录冲突范围。...,所以在操作时会全表扫描导致锁整个表,可以通过建普通索引或者建(复合索引,联合索引{自己认为的})进行优化。...6 修改主键和其中一个字段为复合索引mysql> show create table t;+-------+-----------------------------------------------...----------------------------------------------------------------------------+1 row in set (0.00 sec)联合主键体现在多个表上

    2.5K10

    MySQL4_联合-子查询-视图-事务-索引

    文章目录 MySQL_联合-子查询-视图-事务-索引 1.联合查询 关键字:`union` 2.多表查询 多表查询的分类 内连接(inner join ... on ..)...数据库(mysql)中保存操作记录(较全) 7.悲观锁 8.乐观锁 9.索引 索引的创建原则 索引的类型 mysql优化 MySQL_联合-子查询-视图-事务-索引 1.联合查询 关键字:union 将多个...#key 优点:加速了查找的速度 缺点: 1.额外的使用了一些存储的空间 2.索引会让写的操作变慢 #mysql中的索引算法叫做 B+tree(二叉树) 索引的创建原则 适用于myisam的表引擎 #...外键索引(foreign key) #只能在innodb的表引擎下使用 3.唯一键(unique) 4.全文索引(fulltext key) #在模糊查询的使用,myisam下可以使用 5.普通索引...(index) #联合索引 index key('sid','sname') #只要同时查询两个字段,才会触发 where sid=1 and sname='tom'; mysql优化 1.表类型的不同

    1.8K30

    MySQL联合索引:深度解析与最佳实践指南

    索引作为MySQL性能优化的核心工具,而联合索引则是这个工具集中最强大且最容易被误用的武器。理解联合索引的本质,掌握其设计原则与应用技巧,是每个数据库开发者必须掌握的核心竞争力。...索引跳跃扫描(Index Skip Scan) MySQL 8.0.13+新特性: 在某些条件下,即使查询条件不包含最左列,优化器也能使用联合索引: -- MySQL 8.0.13+ 可能使用索引 SELECT...阶段二:联合索引普及(MySQL 5.0-5.6) 优化器改进:支持索引合并(Index Merge) 新特性: Index Merge Intersection:多个单列索引的交集...Index Merge Union:多个单列索引的并集 局限性:合并操作成本高,不如直接使用联合索引 阶段三:优化器智能化(MySQL 5.7-8.0) 增强功能: 更好的成本估算模型...选择选择性接近完整列的最小长度 -- 通常选择选择性 > 0.9 的最小前缀长度 五、实战案例:电商系统联合索引设计 场景分析 电商订单表orders,主要查询场景: 用户查看自己的订单(user_id

    83210

    进阶-联合索引

    创建普通索引的时候,指定两个或更多的字段 这就是联合索引,语法如下 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...如果遇到了范围查询,比如()和 between 等, 会停止匹配,那后面的列就不会用到联合索引了。...where k1 > 1 AND k2 = 2 AND k3 = 3 #这里k1 使用了范围查询,所以后面的k2,和k3 列就不会使用到联合索引了 这里有几条SQL语句,说说它们分别用到了哪个索引呢

    99530

    「Mysql索引原理(十四)」索引案例3-优化排序

    在这个学习案例中,最后要介绍的是排序。使用文件排序对小数据集是很快的,但如果个查询匹配的结果有上百万行的话会怎样?例如如果 WHERE子句只有sex列,如何排序?...例如,可以创建(sex,rating)索引用于下面的查询: mysql> SELECT FROM profiles WHERE sex=‘M’ ORDER BY rating LIMIT...因为随着偏移量的增加, MySQL需要花费大量的时间来扫描需要丢弃的数据。反范式化、预先计算和缓存可能是解决这类查询的仅有策略。...优化这类索引的另一个比较好的策略是使用延迟关联,通过使用覆盖索引查询返回需要的主键,再根据这些主键关联原表获得需要的行。这可以减少 MySQL扫描那些需要丢弃的行数。...下面这个查询显示了如何高效地使用( sex, rating)索引进行排序和分页 mysql> SELECT FROM profiles INNER JOIN (SELECT <primary

    89530

    覆盖索引,联合索引,索引下推

    覆盖索引: 如果查询条件使用的是普通索引(或是联合索引的最左原则字段),查询结果是联合索引的字段或是主键,不用回表操作,直接返回结果,减少IO磁盘读写读取正行数据 最左前缀: 联合索引的最左 N 个字段...,也可以是字符串索引的最左 M 个字符 联合索引: 根据创建联合索引的顺序,以最左原则进行where检索,比如(age,name)以age=1 或 age= 1 and name=‘张三’可以使用索引,...单以name=‘张三’ 不会使用索引,考虑到存储空间的问题,还请根据业务需求,将查找频繁的数据进行靠左创建索引。...索引下推: like 'hello%’and age >10 检索,MySQL5.6版本之前,会对匹配的数据进行回表查询。

    1.5K40
    领券