mysql可不可以创建联合索引

57次阅读
没有评论

共计 2635 个字符,预计需要花费 7 分钟才能阅读完成。

这篇文章主要介绍“mysql 可不可以创建联合索引”,在日常操作中,相信很多人在 mysql 可不可以创建联合索引问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql 可不可以创建联合索引”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

mysql 可以创建联合索引。MySQL 允许用户创建一个最多包含 16 列的联合索引,创建方法有两个:1、创建表时创建,语法“CREATE TABLE 表名 (列名 1 类型 PRIMARY KEY, 列名 2 类型, 列名 3 类型,…INDEX 索引名 ( 列名 2, 列名 3 …));”;2、修改表时创建,语法“CREATE INDEX 索引名 ON 表名 (列名 2, 列名 3, 列名 4);”。

本教程操作环境:windows7 系统、mysql8 版本、Dell G3 电脑。

什么是联合索引?联合索引的本质:最左匹配

两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。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
 *
 table_name
WHERE
 c1 = v1;
 
 
SELECT
 *
 table_name
WHERE
 c1 = v1 AND 
 c2 = v2;
 
 
SELECT 
 *
 table_name
WHERE
 c1 = v1 AND 
 c2 = v2 AND 
 c3 = v3;

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

SELECT
 *
 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
 employees
WHERE
 lastName =  Patterson

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

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

EXPLAIN SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson

这是输出:

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

SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson AND
 firstName =  Steve 

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

我们来核实一下:

EXPLAIN SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson AND
 firstName =  Steve 

输出是:

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

SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson AND
 (firstName =  Steve  OR 
 firstName =  Mary 

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

以下语句验证索引用法:

EXPLAIN SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 lastName =  Patterson AND
 (firstName =  Steve  OR 
 firstName =  Mary 

输出是:

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

SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 firstName =  Leslie

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

SELECT 
 firstName, 
 lastName, 
 email
 employees
WHERE
 firstName =  Anthony  OR
 lastName =  Steve

到此,关于“mysql 可不可以创建联合索引”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计2635字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)