mysql中复合索引语法_MySQL 复合索引
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,
FROM
employees
WHERE
lastName = 'Patterson';
此查询使用名称索引,因为索引的最左边前缀(即lastName列)用于查找。
您可以通过EXPLAIN在查询中添加子句来验证这一点:
EXPLAIN SELECT
firstName,
lastName,
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,
FROM
employees
WHERE
lastName = 'Patterson' AND
firstName = 'Steve';
在此查询中,两个lastName和firstName列都用于查找,因此,它使用name索引。
我们来核实一下:
EXPLAIN SELECT
firstName,
lastName,
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,
FROM
employees
WHERE
lastName = 'Patterson' AND
(firstName = 'Steve' OR
firstName = 'Mary');
此查询类似于第二个查询,其中两个lastName和firstName列都用于查找。
以下语句验证索引用法:
EXPLAIN SELECT
firstName,
lastName,
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,
FROM
employees
WHERE
firstName = 'Leslie';
类似地,查询优化器不能在以下查询中使用名称索引进行查找,因为firstName或者lastName列用于查找。
SELECT
firstName,
lastName,
FROM
employees
WHERE
firstName = 'Anthony' OR
lastName = 'Steve';
在本教程中,您学习了如何使用MySQL组合索引来加速查询。
mysql中复合索引语法_MySQL 复合索引相关推荐
- Mysql中去重的语法_MySQL去重distinct
去重 在MySQL中需要查询表中不重复的记录时,可以使用distinct关键字过滤重复记录. 语法: select distinct [,...,] from ; 数据表如下: mysql> s ...
- mysql中怎样查看和删除唯一索引
mysql中怎样查看和删除唯一索引. 查看唯一索引: show index from mytable;//mytable 是表名 查询结果例如以下: 查询到唯一索引后,怎样删除唯一索引呢,使用例如以下 ...
- mysql的char在java中表示为_Java学习篇之-Mysql中varchar门类总结_mysql
java学习篇之---mysql中varchar类型总结 Mysql中varchar类型总结 今天新做一个项目,需要自己进行数据库设计,发现自己对varchar的用法还不是很熟悉,所以查阅资料总结若下 ...
- mysql复合索引优点_mysql 联合索引有什么好处? 联合索引的意义
mysql 里创建'联合索引'的意义 问题? 因为什么需求,要创建'联合索引'?最实际好处在于什么?如果是为了更快查询到数据,有单列索引不是Ok?为什么有'联合索引'的存在? 简单的说有两个主要原因: ...
- mysql 唯一索引和复合索引 区别_MySQL复合唯一索引分析
MySQL复合唯一索引分析 关于复合唯一索引(unique key 或 unique index),网上搜索不少人说:"这种索引起到的关键作用是约束,查询时性能上没有得到提高或者查询时根本没 ...
- mysql复合索引abcac可以索引吗_MySQL联合索引
在一次查询中,MySQL只能使用一个索引. 在真实项目中,SQL语句中的WHERE子句里通常会包含多个查询条件还会有排序.分组等. 若表中索引过多,会影响INSERT及UPDATE性能,简单说就是会影 ...
- mysql 索引语法_MySQL 索引:语法及案例剖析
MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索 ...
- mysql的select复合查询语法_MySQL(九)之数据表的查询详解(SELECT语法)二
上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等.希望大家能都得到帮助! 在开始之前因为要多表查询,所以搭建好环境: 1 ...
- mysql 联合索引 性能_mysql:联合索引及优化
命名规则:表名_字段名 1.需要加索引的字段,要在where条件中 2.数据量少的字段不需要加索引 3.如果where条件中是OR关系,加索引不起作用 4.符合最左原则 尽量不要用or,如果可以用un ...
最新文章
- 图解深度学习(图灵出品)
- 云端卫士DDoS防护解决方案助力互联网金融安全
- 堆空间大小怎么配置,各区域怎么划分
- 五种最易被老板开除的人
- nginx location 匹配 多个规则_你需要知道的Nginx配置二三事
- spark项目实战:电商分析平台之项目概述
- html列表小写字母,python实现大小写字母转换
- MATLAB数据分析
- Windows Embedded CE 6.0开发初体验(二)CE开发环境
- 自定义枚举typeHandler
- 信息学奥赛一本通 1223:An Easy Problem | OpenJudge NOI 4.6 1455:An Easy Problem
- 基于bootstrap_登陆页面
- python字典与yaml文件转换
- Matlab SVPWM仿真模型
- 爬虫:爬取网页表格内容,写入scv文件并绘图
- 国美易卡依托大数据平台提供便捷服务
- Centos升级安装Openssh9.0p1
- python无法启动0xc0000022_无法正常启动0xc0000022_0xc0000022一键修复教程 - 系统家园...
- 李昌镐:苍老的青春(转载)
- vSphere6.7创建Windows Server 2019虚拟机及磁盘扩容