常用的mysql索引创建和优化

2023年 8月 3日 34.7k 0

MySQL是一种常见的关系型数据库,索引是提高数据库查询性能的重要手段。本文将介绍常用的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 组合索引进行查询时,也能获得很高的查询性能;但是,在某些情况下,可能会导致组合索引变得太复杂,从而得不到很好的查询性能。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论