数据库之索引

1. 索引的定义

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

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

2. 索引的工作方式

有了索引后,要根据条件查询某行数据时,需要先扫描全表,再定位某行数据的位置。有了索引之后,会先通过查询条件的字段值找到其索引对应的行记录数据的物理地址。然后根据物理地址访问相应的行记录的数据,就像根据书目录的页码快速找到所需的内容。

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

3. 创建索引的依据

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

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

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

4. 索引的类型

普通索引

唯一索引

主键索引

组合索引

全文索引

5. 索引的增删查

bash 复制代码
##添加普通索引的方法
create index 索引名称 on 表名 (字段名);
 
alter table 表名 add index 索引名称 (字段);
 
还可以在创建表格时候就添加,但是不建议使用
create table 表名(字段1 数据类型,....index 索引名称 (字段));

唯一索引创建

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

bash 复制代码
create unique index 索引名 on 表名 (字段名);
 
alter table 表名 add unique key (字段名);
 
alter table 表名 add unique 索引名 (字段名);

主键索引创建

是一种特殊的唯一索引,必须指定为"PRIMARY KEY"。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。

bash 复制代码
alter table 表名 add primary key (字段名);

组合索引创建

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

bash 复制代码
create index 索引名称 on 表名 (字段1,字段2...);
 
alter table 表名 add index 索引名称 (字段1,字段2...);

全文索引

适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。

bash 复制代码
create fulltext index 索引名称 on 表名 (字段);
 
alter table 表名 add fulltext 索引名称  (字段);
 
支持模糊查询   
select .... from 表名 where match(字段) against('单词');

查看索引

bash 复制代码
show create table 表名
show index from 表名
show keys from 表名

删除索引

bash 复制代码
drop index 索引名 on 表名;
alter table 表名 drop index 索引名;
alter table 表名 drop primary key;

6. 遇到select 语句查询速度慢怎么办

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

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

相关推荐
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO10 分钟前
MySQL事务
数据库·mysql
cyt涛2 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油2 小时前
01_SQLite
数据库·sqlite
liuxin334455662 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。3 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec3 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa3 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke4 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D4 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
小宇成长录4 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份