MySQL 索引的使用

介绍

索引是为了提高查询速度,但相对的会对 insertupdatedelete 这些更新操作造成影响,所以在选择索引的时候要注意,对其表先进行评审,看其查询频繁还是更新频繁,选择最合适的方法,不要盲目的添加索引。

查看表索引

1
mysql> show index from table_name

索引管理

1
2
3
4
5
6
-- 创建
mysql> create index index_name on table_name(index_field); -- 单列索引
mysql> create index index_name on table_name(index_field2, index_field2); -- 多列索引

-- 删除
mysql> drop index index_name on table_name;

索引类型

  • 主键索引 : 强调字段不为空,且唯一,一般会在主键字段上面添加
  • 唯一索引 : 字段可为空,且唯一
  • 普通索引 : 一般索引
  • 全文索引

创建索引规则

  • 主键和外键上面必须添加索引
  • 左右连接时的条件字段上面加索引
  • where 条件经常使用的字段加索引,但值幅度变化不大的不需要加索引
  • where 经常使用多列的时候,可以考虑复合索引
  • 索引在小的字段值上面效果越好,比如 int 型比 char 效果好
  • 频繁更新的表不要加过多的索引,避免更新变慢
  • 删除无用的索引,不然有时会意外影响其他索引的使用

explain 分析索引使用

如果想对 sql 语句进行优化的时候,就需要对其进行分析,mysql 提供了 explain 进行分析,这个关键字使得 MySQL 不是去执行那条 SELECT 命令,具体用法如下:

1
mysql> explain select * from table where height > 180;

结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
id            | 1       
select_type | SIMPLE // 表示查询的类型
table | table // 输出结果集的表
type | ref // 表示表的连接类型
possible_keys | index_height // 表示查询时,可能使用的索引
key | index_height // 表示实际使用的索引
key_len | 5 // 索引字段的长度
ref | const //
rows | 100 // 扫描出的行数(估算的行数)
Extra | Using index condition // 执行情况的描述和说明

1 row in set
Time: 0.009s

mysql 索引失效

  1. 在 like 左侧是用 %
  2. 使用 mysql 函数
  3. 对索引进行运算
  4. 隐式转换
  5. 多列索引遵循最左规则
  6. 使用 not

查看索引的使用情况

1
mysql> show global status like 'Handler_read%';

Handler_read_key 数值越大的话,表示索引使用率高
Handler_read_rnd 查询直接操作了数据文件,是没有使用索引
Handler_read_rnd_next 数值越大的话,表示索引低效
Handler_read_next 此选项表明在进行索引扫描时,按照索引从数据文件里取数据的次数

其他注意事项

  • 在使用 group by field 的时候,mysql 会默认对查出的数据按照字段 field 进行排序,如果我们不需要排序的话,这样就影响性能,那么可以使用 order by null 将排序置空
  • 如果出现数据迁移的情况,首先将数据库的索引全部禁用,不然的话会影响写入的速度,因为索引主要是提高了查询速度,但是降低了数据的操作,等数据迁移完毕之后,开启索引
  • 在字段数据类型设置的时候,如果对数据精确度要求高的,就使用 decimal,而不要使用 float

©版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 & 作者信息

End

坚持原创技术分享,您的支持将鼓励我继续创作!
Flyertutor WeChat Pay

WeChat Pay

Flyertutor Alipay

Alipay