MySQL 复合索引

简介:在本例中,您将了解MySQL组合索引以及如何使用它来加速查询。

MySQL复合索引简介

复合索引是多列的索引。MySQL允许您创建一个最多包含16列的复合索引。

复合索引也称为多列索引。

查询优化器将复合索引用于测试索引中所有列的查询,或者测试第一列,前两列等的查询。

如果在索引定义中以正确的顺序指定列,则单个复合索引可以在同一个表上加速这些类型的查询。

要在创建表时创建复合索引,请使用以下语句:

CREATE TABLE table_name (

c1 data_type PRIMARY KEY,

c2 data_type,

c3 data_type,

c4 data_type,

INDEX index_name (c2,c3,c4)

);

在此语法中,复合索引由三列c2,c3和c4组成。

或者,您可以使用以下CREATE INDEX语句将复合索引添加到现有表:

CREATE INDEX index_name

ON table_name(c2,c3,c4);

请注意,如果您在(c1,c2,c3)上有复合索引,则您将在以下列组合之一上建立索引搜索功能:

(c1)

(c1,c2)

(c1,c2,c3)

例如:

SELECT

*

FROM

table_name

WHERE

c1 = v1;

SELECT

*

FROM

table_name

WHERE

c1 = v1 AND

c2 = v2;

SELECT

*

FROM

table_name

WHERE

c1 = v1 AND

c2 = v2 AND

c3 = v3;

如果列不形成索引的最左前缀,则查询优化器无法使用索引执行查找。例如,以下查询无法使用复合进行查找:

SELECT

*

FROM

table_name

WHERE

c1 = v1 AND

c3 = v3;

MySQL综合索引示例

我们将使用示例数据库中的employees表进行演示。

+----------------+

| employees |

+----------------+

| employeeNumber |

| lastName |

| firstName |

| extension |

| email |

| officeCode |

| reportsTo |

| jobTitle |

+----------------+

8 rows in set (0.14 sec)

以下语句在lastName和firstName列上创建复合索引:

CREATE INDEX name

ON employees(lastName, firstName);

首先,name索引可用于指定lastName值的查询中的查找,因为lastName列是索引的最左前缀。

其次,name索引可用于指定lastName和firstName值组合的值的查询。

name索引用于在以下的查询查找:

1)查找姓氏为的员工 Patterson

SELECT

firstName,

lastName,

email

FROM

employees

WHERE

lastName = 'Patterson';

此查询使用名称索引,因为索引的最左边前缀(即lastName列)用于查找。

您可以通过EXPLAIN在查询中添加子句来验证这一点:

EXPLAIN SELECT

firstName,

lastName,

email

FROM

employees

WHERE

lastName = 'Patterson';

这是输出:

+----+-------------+-----------+------------+------+---------------+------+---------+-------+------+----------+-------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-----------+------------+------+---------------+------+---------+-------+------+----------+-------+

| 1 | SIMPLE | employees | NULL | ref | name | name | 152 | const | 3 | 100.00 | NULL |

+----+-------------+-----------+------------+------+---------------+------+---------+-------+------+----------+-------+

1 row in set, 1 warning (0.01 sec)

2)查找姓氏Patterson和名字的员工Steve:

SELECT

firstName,

lastName,

email

FROM

employees

WHERE

lastName = 'Patterson' AND

firstName = 'Steve';

在此查询中,两个lastName和firstName列都用于查找,因此,它使用name索引。

我们来核实一下:

EXPLAIN SELECT

firstName,

lastName,

email

FROM

employees

WHERE

lastName = 'Patterson' AND

firstName = 'Steve';

输出是:

+----+-------------+-----------+------------+------+---------------+------+---------+-------------+------+----------+-------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-----------+------------+------+---------------+------+---------+-------------+------+----------+-------+

| 1 | SIMPLE | employees | NULL | ref | name | name | 304 | const,const | 1 | 100.00 | NULL |

+----+-------------+-----------+------------+------+---------------+------+---------+-------------+------+----------+-------+

1 row in set, 1 warning (0.08 sec)

3)查找姓氏Patterson和名字是Steve或的员工Mary:

SELECT

firstName,

lastName,

email

FROM

employees

WHERE

lastName = 'Patterson' AND

(firstName = 'Steve' OR

firstName = 'Mary');

此查询类似于第二个查询,其中两个lastName和firstName列都用于查找。

以下语句验证索引用法:

EXPLAIN SELECT

firstName,

lastName,

email

FROM

employees

WHERE

lastName = 'Patterson' AND

(firstName = 'Steve' OR

firstName = 'Mary');

输出是:

+----+-------------+-----------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-----------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+

| 1 | SIMPLE | employees | NULL | range | name | name | 304 | NULL | 2 | 100.00 | Using index condition |

+----+-------------+-----------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+

1 row in set, 1 warning (0.00 sec)

查询优化器不能在以下查询中使用name索引进行查找,因为只使用了firstName不是索引最左前缀的列:

SELECT

firstName,

lastName,

email

FROM

employees

WHERE

firstName = 'Leslie';

类似地,查询优化器不能在以下查询中使用名称索引进行查找,因为firstName或者lastName列用于查找。

SELECT

firstName,

lastName,

email

FROM

employees

WHERE

firstName = 'Anthony' OR

lastName = 'Steve';

在本教程中,您学习了如何使用MySQL组合索引来加速查询。

mysql中复合索引语法_MySQL 复合索引相关推荐

  1. Mysql中去重的语法_MySQL去重distinct

    去重 在MySQL中需要查询表中不重复的记录时,可以使用distinct关键字过滤重复记录. 语法: select distinct [,...,] from ; 数据表如下: mysql> s ...

  2. mysql中怎样查看和删除唯一索引

    mysql中怎样查看和删除唯一索引. 查看唯一索引: show index from mytable;//mytable 是表名 查询结果例如以下: 查询到唯一索引后,怎样删除唯一索引呢,使用例如以下 ...

  3. mysql的char在java中表示为_Java学习篇之-Mysql中varchar门类总结_mysql

    java学习篇之---mysql中varchar类型总结 Mysql中varchar类型总结 今天新做一个项目,需要自己进行数据库设计,发现自己对varchar的用法还不是很熟悉,所以查阅资料总结若下 ...

  4. mysql复合索引优点_mysql 联合索引有什么好处? 联合索引的意义

    mysql 里创建'联合索引'的意义 问题? 因为什么需求,要创建'联合索引'?最实际好处在于什么?如果是为了更快查询到数据,有单列索引不是Ok?为什么有'联合索引'的存在? 简单的说有两个主要原因: ...

  5. mysql 唯一索引和复合索引 区别_MySQL复合唯一索引分析

    MySQL复合唯一索引分析 关于复合唯一索引(unique key 或 unique index),网上搜索不少人说:"这种索引起到的关键作用是约束,查询时性能上没有得到提高或者查询时根本没 ...

  6. mysql复合索引abcac可以索引吗_MySQL联合索引

    在一次查询中,MySQL只能使用一个索引. 在真实项目中,SQL语句中的WHERE子句里通常会包含多个查询条件还会有排序.分组等. 若表中索引过多,会影响INSERT及UPDATE性能,简单说就是会影 ...

  7. mysql 索引语法_MySQL 索引:语法及案例剖析

    MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索 ...

  8. mysql的select复合查询语法_MySQL(九)之数据表的查询详解(SELECT语法)二

    上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1 ...

  9. mysql 联合索引 性能_mysql:联合索引及优化

    命名规则:表名_字段名 1.需要加索引的字段,要在where条件中 2.数据量少的字段不需要加索引 3.如果where条件中是OR关系,加索引不起作用 4.符合最左原则 尽量不要用or,如果可以用un ...

最新文章

  1. 图解深度学习(图灵出品)
  2. 云端卫士DDoS防护解决方案助力互联网金融安全
  3. 堆空间大小怎么配置,各区域怎么划分
  4. 五种最易被老板开除的人
  5. nginx location 匹配 多个规则_你需要知道的Nginx配置二三事
  6. spark项目实战:电商分析平台之项目概述
  7. html列表小写字母,python实现大小写字母转换
  8. MATLAB数据分析
  9. Windows Embedded CE 6.0开发初体验(二)CE开发环境
  10. 自定义枚举typeHandler
  11. 信息学奥赛一本通 1223:An Easy Problem | OpenJudge NOI 4.6 1455:An Easy Problem
  12. 基于bootstrap_登陆页面
  13. python字典与yaml文件转换
  14. Matlab SVPWM仿真模型
  15. 爬虫:爬取网页表格内容,写入scv文件并绘图
  16. 国美易卡依托大数据平台提供便捷服务
  17. Centos升级安装Openssh9.0p1
  18. python无法启动0xc0000022_无法正常启动0xc0000022_0xc0000022一键修复教程 - 系统家园...
  19. 李昌镐:苍老的青春(转载)
  20. vSphere6.7创建Windows Server 2019虚拟机及磁盘扩容

热门文章

  1. c++ win窗口消息演示
  2. 你与高手的差距,就在这个思考方式
  3. 开发者进行广告合作的几大误区
  4. 将OSG嵌入QT窗口系统中,实现拖拽界面
  5. 将指定格式的文字进行格式替换更换字体颜色、字号、字形等
  6. [230]连接Redis后执行命令错误 MISCONF Redis is configured to save RDB snapshots
  7. 3 + 2 ÷ 0 = ?
  8. 数据库基础与SQL基础知识看这篇就够了!
  9. 大学计算机专业论文提纲范文,计算机专业论文提纲范文
  10. 《花开半夏》--3 对峙(2)