mysql多列索引特点和使用场景

  • 单列索引
    • 查看sql的执行计划
  • 索引合并
  • 多列索引
    • 再看sql的执行计划
  • 多列索引的顺序
    • 最左前缀
  • 添加数据的脚本

首先创建一张表,有姓’first_name’、名’last_name’、父ID等字段:

CREATE TABLE `users` (`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',`user_id` int NOT NULL COMMENT '用户ID',`first_name` varchar(32) DEFAULT NULL COMMENT '姓',`last_name` varchar(32) DEFAULT NULL COMMENT '名',`parent_id` int NOT NULL COMMENT 'parentID',`created_by` varchar(32) NOT NULL DEFAULT 'sys' COMMENT '创建者',`created_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_by` varchar(32) NOT NULL DEFAULT 'sys' COMMENT '修改者',`updated_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',`is_deleted` varchar(1) NOT NULL DEFAULT '0' COMMENT '是否删除:0未删除、1已删除',PRIMARY KEY (`id`),KEY `index_user_id` (`user_id`) USING BTREE,KEY `index_first_name` (`first_name`) USING BTREE,KEY `index_last_name` (`last_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb3 COMMENT='用户表';

接下来我们加入一些数据,代码放后边。

单列索引

我们知道,
where只能使用一个索引,mysql会寻找它认为是最优秀的那个索引,就是限制最严格的索引,
不过对于多个单列索引,mysql5.0及以上会进行索引合并,并将结果进行合并。

查看sql的执行计划

EXPLAIN SELECT * FROM `users` WHERE first_name = 'Vm5' AND last_name = 'utD';


可以看到type是index_merge,这便是索引合并。

索引合并

索引合并能分三种:or联合、and相交、and和or结合,
查询能够同时使用多个单列索引,并将结果进行合并,意味着需要额外消耗cpu、内存等资源,
即便如此也比只用到一个索引的成本低。

索引合并策略是一种优化,若出现这种情况通常,通常说明需要一个包含相关列的多列索引。

多列索引

根据查询需求在多个字段上建立一个索引,一定程度上可以使用多个列的值来定位指定的行。

我们添加一个包含了first_name、last_name的多列索引index_first_last_name:

ALTER TABLE `users` ADD KEY `index_first_last_name` (`first_name`,`last_name`) USING BTREE;

再看sql的执行计划

EXPLAIN SELECT * FROM `users` WHERE first_name = 'Vm5' AND last_name = 'utD';


可见在WHERE first_name = ‘?’ AND last_name = '?'时,
多列索引限制要比之前的单列索引更强,或者说更多,
mysql可以立即找到匹配的first_name然后last_name。

不过要注意:

SELECT * FROM `users` WHERE first_name = 'Vm5' OR last_name = 'utD';

这里’or’是用不到多列索引的。

多列索引相比多个单列索引,会占用更少的磁盘空间。

有兴趣可以看下
通过B+Tree平衡多叉树理解InnoDB引擎的聚集和非聚集索引

多列索引的顺序

多列索引的顺序至关重要,
经验告诉我们,将选择性高的列放在左边(但不是绝对的),
需要考虑全局的查询需求,而不是某个具体的查询。

像:
KEY index_first_last_name (first_name,last_name)
有时候我们只需要知道用户的姓,
有时候可能还会统计某一个姓的人有多少,所以这里first_name放左边。

SELECT * FROM `users` WHERE last_name = 'utD';

只有last_name作为过滤条件时,也是用不到多列索引的。

最左前缀

对于:
KEY a_b_c (a,b,c)
多列索引最左边的列必须出现在过滤条件中,并且不能跳跃,
不然最左前缀会失效,大大降低查询效率。

可以用到最左前缀的场景有:a、a&b、a&b&c,
a&c、b&c这种是使用不到的。

添加数据的脚本

我是通过main函数来打印sql,然后输出console到文件,保存为脚本。

 public static void main(String[] args) {System.out.println("INSERT INTO `users` (`user_id`, `first_name`, `last_name`, `parent_id`) VALUES");for (int i = 1; i < 130001; i++) {StringBuilder sqlSb = new StringBuilder();sqlSb.append("(");sqlSb.append(i + ", ");sqlSb.append("'" + RandomStringUtils.randomAlphanumeric(3) + "', ");sqlSb.append("'" + RandomStringUtils.randomAlphanumeric(3) + "', ");sqlSb.append(i/1000);sqlSb.append(")");if (i < 130000) {sqlSb.append(",");} else {sqlSb.append(";");}System.out.println(sqlSb.toString());}}

右键类→run configurations→common

参考文章:

果儿妈:MySQL单列索引和组合索引的选择效率与explain分析
雨文100:正确理解Mysql的列索引和多列索引
duanx:mysql索引之五:多列索引

mysql多列索引(组合索引)特点和使用场景相关推荐

  1. 复合索引 /多列索引 /联合索引 /组合索引?????

    复合索引 /多列索引 /联合索引 /组合索引,一个意思,不同叫法. 含有多个列字段的索引 联合索引也是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2. 例如: 创建数据库表CREATE ...

  2. 组合索引mysql语句_Mysql之组合索引方法详解

    对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降. 如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅 ...

  3. mysql 主键 索引类型_MYSQL常见索引类型(主键索引/唯一索引/普通索引/组合索引)...

    在数据量特别大的数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令MySQL的查询和运行更加高效. 一.MySQL常见的索引类型如下 MySQL常见索引有:主键索引.唯一索引.普 ...

  4. MySQL调优(三):索引基本实现原理及索引优化,哈希索引 / 组合索引 / 簇族索引等

    索引基本知识 索引匹配方式 哈希索引 当需要存储大量的URL,并且根据URL进行搜索查找,如果使用B+树,存储的内容就会很大 select id from url where url="&q ...

  5. MySQL数据库索引组合索引的最左优先原则

    最左优先原则:组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到.只要组合索引最左边第一个字段出现在Where中,那么不管后面的字段出现与否或者出现顺序如何,MySQL引擎都会自动调用索引来 ...

  6. 普通索引 唯一索引 主键索引 组合索引 全文索引

    普通索引 这是最基本的索引,它没有任何限制.它有以下几种创建方式: (1)直接创建索引 CREATE INDEX index_name ON table(column(length)) (2)修改表结 ...

  7. MySQL中的组合索引

    MySQL中的组合索引(复合索引) 使用多个字段创建索引,只用在查询条件中使用了创建索引时的第一个字段,索引才会被使用(最左前缀原则): 一.最左前缀原则 最左优先: 例 使用表中的name,addr ...

  8. mysql 组合索引 or_Mysql_组合索引和单列索引

    一.目标 什么时候使用组合索引,什么时候使用单独索引 组合索引.单独索引区别 组合索引:最左前缀匹配原则 二.前期数据准备 1. 建表 CREATE TABLE `user` ( `uid`int(1 ...

  9. mysql 组合索引 or_mysql索引优化实例(单列索引与组合索引)

    索引一般用于在数据规模大时对查询进行优化的一种机制,对于一般的查询来说,mysql会去遍历整个表,来查询符合要求的结果: 如果借助于mysql索引,mysql会将要索引的字段按照一定的算法进行处理,并 ...

  10. MySQL的索引(普通索引、唯一索引,主键索引、组合索引、全文索引、空间索引)相关操作

    目录 索引介绍 Hash索引和B+tree索引的区别 应用场景 索引分类 普通索引 创建单列索引--普通索引(3种语法) 查看数据库中的索引 查看数据表中的索引 删除索引 唯一索引 主键索引 组合索引 ...

最新文章

  1. 用Bioconductor对基因组注释
  2. Vivado联合ModelSim仿真设置(附图步骤)
  3. VC++之自定义消息
  4. Windows Server入门系列之十六 端口、连接与端口扫描
  5. JS实现在输入框内输入@时,邮箱账号自动补全
  6. 【Python 标准库学习】容器数据类型库 — collections
  7. 南大cssci期刊目录_最新版CSSCI来源期刊目录(2019-2020)及增减变化!【南大核心】...
  8. upupoo怎么设置本地html文件,关于Upupoo自定义元素教程
  9. 利用JDBC工具类 模拟用户登录!
  10. Windows Server 2016安装IIS服务步骤
  11. uni-app框架介绍
  12. 单片机复位电路基础知识解析
  13. sigmoid/逻辑回归/多元逻辑回归/softmax 区别
  14. html给按钮加颜色代码,HTML按钮上的默认颜色代码
  15. 好的技术领导与差的技术领导,千万不要对号入座,你会死的很惨!
  16. 【无线芯片解读】2.4G专题:Si24R1
  17. 动手学pytorch笔记整理12
  18. oracle从序列中查最大id,Oracle序列详解
  19. pytorch 报告bug: Assertion idx_dim >= 0 idx_dim < index_size “index out of bounds“
  20. 数据库管理与高可用----MySQL高可用搭建

热门文章

  1. Winsock Fix for Windows 7
  2. 转载《士兵突击》观后杂感
  3. 一个屌丝程序猿的人生(三十五)
  4. 用mask-rcnn训练自己的数据
  5. 处理ios软键盘弹起和收起时页面滚动问题
  6. 一个Linux病毒艰辛短暂的一生
  7. Unity—常用API(重点)
  8. 共享文件夹—— 一个实现Mac与PC互传文件,维护同一个文件夹简单的方法
  9. c语言关键字和运算符,C语言关键字和运算符.doc
  10. Android AccountManager帐号管理(二)