介绍
索引是为了提高查询速度,但相对的会对 insert
、 update
、 delete
这些更新操作造成影响,所以在选择索引的时候要注意,对其表先进行评审,看其查询频繁还是更新频繁,选择最合适的方法,不要盲目的添加索引。
查看表索引
1 | mysql> show index from table_name |
索引管理
1 | -- 创建 |
索引类型
- 主键索引 : 强调字段不为空,且唯一,一般会在主键字段上面添加
- 唯一索引 : 字段可为空,且唯一
- 普通索引 : 一般索引
- 全文索引
创建索引规则
- 主键和外键上面必须添加索引
- 左右连接时的条件字段上面加索引
- 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
13id | 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 索引失效
- 在 like 左侧是用
%
- 使用 mysql 函数
- 对索引进行运算
- 隐式转换
- 多列索引遵循最左规则
- 使用 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