MySQL是一种常见的关系型数据库,索引是提高数据库查询性能的重要手段。本文将介绍常用的MySQL索引创建和优化。
首先,创建索引的基本语法如下:
CREATE INDEX index_name ON table_name(column_name);
其中,index_name 为索引名称,table_name 为表名称,column_name 为字段名称。
以下是常见的MySQL索引优化技巧:
1. 确定索引合适的数据类型:
CREATE TABLE `test` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SELECT * FROM test WHERE id=123;
SELECT * FROM test WHERE id='123';
由于 id 字段为 BIGINT 类型,因此在查询时应使用数字格式的条件。如果使用字符串类型的条件进行查询,会发生类型转换,拖慢查询速度。
2. 确定索引的选择性:
CREATE TABLE `test` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`type` TINYINT UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SELECT * FROM test WHERE type=1;
在上述语句中,type 字段的选择性为 1/256。如果在表中有大量的 type 字段值都为 1,那么使用 type 索引进行查询时,并不能很好地优化查询速度。
3. 确定索引列的顺序:
CREATE TABLE `test` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`type` TINYINT UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `test_index` (`type`, `name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SELECT * FROM test WHERE type=1 AND name='test';
在上述语句中,如果按照 name 字段进行索引,会得到很高的查询性能;但是,使用 type 和 name 组合索引进行查询时,也能获得很高的查询性能。
4. 避免在索引列上使用函数或表达式:
CREATE TABLE `test` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `test_index` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SELECT * FROM test WHERE DATE(create_time)='2021-11-11';
在上述语句中,使用 DATE() 函数获取 create_time 字段中的日期值,从而查询出符合条件的结果。但是,在这个查询中,无法使用 test_index 索引进行优化,因为索引不是在 create_time 字段上,而是在 name 字段上。
5. 避免创建过多的索引:
CREATE TABLE `test` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`type` TINYINT UNSIGNED NOT NULL,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `type` (`type`),
KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SELECT * FROM test WHERE type=1 AND name='test';
在上述语句中,虽然使用 type 和 name 组合索引进行查询时,也能获得很高的查询性能;但是,在某些情况下,可能会导致组合索引变得太复杂,从而得不到很好的查询性能。