Mysql索引

目录

一、定义:

二、作用与副作用:

三、工作方式:

四、创建索引的依据:

五、索引的类型

1、普通索引:

2、唯一索引:

3、主键索引:

4、组合索引:

5、全文索引:


一、定义:

索引是一个排序的列表,包含索引字段的值和其对应的行记录的数据所在的物理地址

二、作用与副作用:

作用:加快表的查询速度,还可以对字段排序

副作用:会额外占用磁盘空间;更新包含索引的表会花费更多的时间,效率会更慢

三、工作方式:

1、没有索引的情况下,要根据条件查询某行数据时,需要先扫描全表,再定位某行数据的位置。

2、有了索引后,会先通过查询条件的字段值找到其索引对应的行记录的数据的物理地址,然后根据物理地址直接访问相应的行记录的数据,就像根据书目录的页码快速找到所需的内容。

四、创建索引的依据:

1)表中的记录行数较多时,一般超过300行的表建议要有索引

2)建议在表中的主键字段、外键字段、多表连接使用的公共关键字段、唯一性较好的字段、不经常更新的字段、经常出现在 where,group by,order by 子语句的字段、 短小的字段上面创建索引

3)不建议在唯一性较差的字段、更新太频繁的字段、大文本字段上面创建索引

五、索引的类型

1、普通索引:

最基本的索引类型,没有唯一性之类的限制

create index 索引名 on 表名(字段);
alter table 表名 add index 索引名(字段);

2、唯一索引:

与普通索引类似,但区别是唯一索引列的每个值都唯一。唯一索引允许有空值(注意和主键不同)。如果是用组合索引创建,则列值的组合必须唯一。添加唯一键将自动创建唯一索引。
create unique index 索引名 on 表名 (字段);
alter table 表名 add unique 索引名 (字段);

3、主键索引:

是一种特殊的唯一索引,必须指定为"PRIMARY KEY"。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。
alter table 表名 add primary key (字段);

4、组合索引:

可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为 select 语句的 where 条件是依次从左往右执行的,所以在使用 select 语句查询时 where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。
create index 索引名 on 表名 (字段1, 字段2, ....);
alter table 表名 add index 索引名 (字段1, 字段2, ....);

5、全文索引:

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。在 MySQL5.6 版本以前FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。
create fulltext index 索引名 on 表名 (字段);
alter table 表名 add fulltext 索引名 (字段);

六、查看索引

show create table 表名;

show index from 表名;

show keys from 表名;

七、删除索引

drop index 索引名 on 表名;
alter table 表名 drop index 索引名;
#除了主键索引,都是可以用以上两种命令删除索引

alter table 表名 drop primary key;
#主键索引只能用alter删除主键的方式

八、遇到 select 语句查询速度慢改怎么办?

1)先使用 explain 分析 select 语句,看 key 字段,确定 select 语句使用使用了索引或索引使用是否正确

2)再根据 select 语句中 where 子语句使用的条件字段创建相应的单列索引或组合索引,组合索引要满足最左原则

相关推荐
闻哥1 分钟前
Redis事务详解
java·数据库·spring boot·redis·缓存·面试
道亦无名30 分钟前
aiPbMgrSendAck
java·网络·数据库
面向对象World3 小时前
正点原子Mini Linux 4.3寸800x480触摸屏gt115x驱动
linux·服务器·数据库
dinga198510264 小时前
mysql之联合索引
数据库·mysql
微风中的麦穗4 小时前
【SQL Server 2019】企业级数据库系统—数据库SQL Server 2019保姆级详细图文下载安装完全指南
大数据·数据库·sqlserver·云计算·个人开发·运维必备·sqlserver2019
zjttsh5 小时前
MySQL加减间隔时间函数DATE_ADD和DATE_SUB的详解
android·数据库·mysql
顾北125 小时前
SpringCloud 系列 04:Gateway 断言 / 过滤器 / 限流 一站式落地指南
java·开发语言·数据库
禹凕5 小时前
MYSQL——基础知识(NULL 值处理)
数据库·mysql
码云数智-大飞5 小时前
SQL Server 无法启动?常见原因及详细解决方法指南
数据库
8486981195 小时前
MySQL 只读库踩坑实录:为什么 INSERT/UPDATE 不报错,DELETE 却直接炸了?
数据库·mysql·hibernate