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表进行演示。
mysql可不可以创建联合索引
以下语句在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');