欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql索引创建和使用优缺点讲解

程序员文章站 2023-10-06 11:22:20
索引是一种特殊的文件, 它包含着对数据表里所有记录的引用. 如果把数据库看做一本书的话, 那么索引就相当于这本书的目录. 创建索引: create index 索引名称 on...

索引是一种特殊的文件, 它包含着对数据表里所有记录的引用. 如果把数据库看做一本书的话, 那么索引就相当于这本书的目录.

创建索引:

create index 索引名称 on 表名 (字段,字段....);

删除索引:

DROP INDEX 索引名称 ON 表名;

显示索引信息

SHOW INDEX FROM table_name;

索引的优点和缺点

优点: 大大加快了数据源的查询

缺点: 创建和维护索引需要先消耗时间,并且随着索引数量的增加,所耗费的时间也会增加..

索引的使用原则:

对经常有更新 的表, 要避免建过多的索引, 对经常用于查询的子弹应该创建索引

数据量小的最好不要使用索引, 由于数据较小, 可能查询全部数据所花费的时间比遍历索引的时间还要短, 索引就不回产生效果,

在同一值少的列不要建立索引,比如学生表的”性别”字段

注意: 索引是在存储引擎中实现的, 也就是说不同的存储引擎, 会使用不同的索引,

索引分类

Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引

单列索引: 一个索引包含单个列,但一个表中可以有多个单列索引,

单列索引可以分为: 普通索引, 唯一索引, 主键索引

普通索引:

mysql中基本索引类型, 没有什么限制, 允许在定义索引的列中插入重复值和空值,只是为了查询数据快一点

唯一索引:

索引列中的值必须是唯一的, 但是允许为空值

主键索引:

是一种特殊的唯一索引, 不允许有空值

组合索引:又称为联合索引

在表中的多个字段组合上创建的索引, 只有在查询条件中使用了这些字段的左边字段时, 索引才会被使用,

比如在mysql表中创建了一个联合索引, myindex(A,B,C)

create index myindex on 表名 (A,B,C);

当where 查询条件 包含A时, 才后悔调用myindex 索引,也就是说,查询条件为BC或者B或者C时,都不会经过myindex.

当查询条件为ABC, AB,AC的时候,都会调用myindex索引

全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时耗空间。

介绍下mysql提供的很有用的一个工具:执行计划

格式:explain + SQL语句;

如下图:

mysql索引创建和使用优缺点讲解

注释:

table: 显示这条sql是关于哪张表的

type: 显示这条sql的查询类型属于哪种,从最好的到最差

const < eq _reg < ref < range < index SQL性能优化的目标:至少要达到 range 级别,要求是ref级别,如果可以是const最好

possible_keys: 可能用到的索引

key:实际用到的索引

key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好 。

ref: 显示索引的哪一列被使用了,如果可能的话, 是一个常数

rows:估计需要扫描的行数

extra;显示以上信息之外的其他信息

Using index–查询使用了覆盖索引(Covering Index),即通过索引就能返回结果,无需访问表

Using where– MySQL 服务器从存储引擎收到行后再进行“后过滤”(Post-filter)。所谓“后过滤”,就是先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃

Using temporary-使用到临时表

Using filesort–若查询所需的排序与使用的索引的排序一致,因为索引是已排序的,因此按索引的顺序读取结果返回,否则,在取得结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现 Using filesort加索引的原则

1) 确定数据量:一般数据规模在10W以上需要考虑索引(并不绝对,当添加索引后,查询效率明显提升)

2) 较频繁的作为查询条件的字段应该创建索引

有时间查询,给日期列添加索引

有字符串列,尽量避免加索引,可以进行类型调整,或加前缀索引

列值范围小的列不用加索引,如枚举列,状态列

在业务上有唯一意义的列,要加唯一索引

在有联合索引的基础上,如果不满足最左原则的查询场景较多,给单列再加索引

索引不宜过多,一般不超过5个

更新非常频繁的字段不适合创建索引

不会出现在where之后的字段不适合创建索引嗯, 先写到这, 后续我了解的多了继续补充