mysql可以创建联合索引吗
什么是联合索引?联合索引的本质:最左匹配
两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。MySQL允许用户创建一个最多包含16列的复合索引。
对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。
例如索引是key index (a,b,c)
. 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
查询优化器将复合索引用于测试索引中所有列的查询,或者测试第一列,前两列等的查询。
如果在索引定义中以正确的顺序指定列,则单个复合索引可以在同一个表上加速这些类型的查询。
创建表时创建联合索引
语法:
CREATE TABLE 表名 (
c1 data_type PRIMARY KEY,
c2 data_type,
c3 data_type,
c4 data_type,
INDEX 索引名 (c2,c3,c4)
);
在此语法中,联合索引由三列c2,c3和c4组成。
修改表时创建联合索引
可以使用以下CREATE INDEX语句将复合索引添加到现有表:
CREATE INDEX 索引名
ON 表名(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表进行演示。
以下语句在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';
这是输出:
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';
输出是:
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');
输出是:
查询优化器不能在以下查询中使用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';
本文出至:学新通
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通
- 本文地址: https://www.swvq.com/boutique/detail/15653
- 联系方式: luke.wu@swvq.com
- 来源链接: www.php.cn/mysql-tutorials-492937.html
-
windows上查看nginx是否启动
PHP中文网 04-19 -
2023年最新的28道PHP面试题附答案
PHP中文网 03-27 -
docker hub 进不去怎么办
PHP中文网 03-15 -
推荐五款xml编辑工具
PHP中文网 03-04 -
navicat怎样清除注册表
PHP中文网 04-05 -
强力推荐10款好看使用的Bootstrap后台管理系统模板
PHP中文网 03-09 -
ChatGPT应用通过Axios+EventSource使用GPT3.5 API
uWydnA 03-13 -
vscode怎么调整代码大小两种方法
PHP中文网 03-11 -
navicat删除的数据能还原吗
PHP中文网 04-09 -
mysql,navicat怎么设置主键自增
PHP中文网 04-08