MySQL数据库:索引

一、索引:

1. 索引的概念:

索引是一个排序的列表 ,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址

使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。

  • 索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
  • 索引是表中一列或者若干列值排序的方法。
  • 建立索引的目的是加快对表中记录的查找或排序。

2.索引的作用:

设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。

  • 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
  • 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
  • 可以加快表与表之间的连接。
  • 在使用分组和排序时,可大大减少分组和排序的时间。
  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能。

3.索引的副作用:

  • 索引需要占用额外的磁盘空间
  • 更改数据会花费更多时间,因为索引也会随之变动

4.创建索引的原则依据:

  • 表的主键、外键必须有索引
  • 记录数超过 300 行的表应该有索引
  • 经常与其他表进行连接的表,在连接字段上应该建立
  • 经常出现在where子句中的字段,特别是大表的字段应该建立索引
  • 索引应该建在选择性高的字段上
  • 索引唯一性太差的字段,不适合建立索引
  • 更新太频繁地字段,不适合创建索引
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

5.索引的分类:

  • 普通索引 (Basic Index):没有特殊限制,单纯为了加速查询速度。
  • 唯一索引 (Unique Index):索引的键值必须唯一,除了加速查询外还能保证数据的唯一性。
  • 主键索引 (Primary Key Index):特殊的唯一索引,每个表只能有一个,不允许为空,并决定了聚集索引的顺序。
  • 组合索引(单列索引与多列索引)
  • 全文索引(Full-text Index):针对文本列的特殊索引,用于对文本内容进行全文搜索。

注:唯一索引和主键索引默认创建

6.索引的创建:

6.1普通索引的创建:

6.1.1直接创建索引:
bash 复制代码
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
 
#(列名(length)):length是可选项。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,这样有利于减小索引文件的大小。
 
#索引名建议以"_index"结尾。
bash 复制代码
show crtate table tset1;
6.1.2 修改表方式创建:
bash 复制代码
ALTER TABLE 表名 ADD INDEX 索引名 (列名);
6.1.3 创建表的时候指定索引:
bash 复制代码
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

6.2 唯一索引的创建:

6.2.1 直接创建唯一索引:
bash 复制代码
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
bash 复制代码
show crtate table tset1;
6.2.2 修改表方式创建:
bash 复制代码
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);
6.2.3 创建表的时候指定:
bash 复制代码
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

6.3 主键索引:

是一种特殊的唯一索引,必须指定为"PRIMARY KEY"

添加主键将自动创建主键索引

6.3.1创建表的时候指定:
bash 复制代码
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));
bash 复制代码
mysql> show create table test04;
6.3.2 修改表方式创建:
bash 复制代码
ALTER TABLE 表名 ADD PRIMARY KEY (列名); 

6.4 组合索引:

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

bash 复制代码
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

判断组合索引是否生效?

bash 复制代码
对以上的表进行select 
select name,id from 表名;			
#会触发组合索引
 
而:
select id,name from 表名;			
#按照索引从左到右检索的顺序,则不会触发组合索引

6.5全文索引:

6.5.1直接创建索引:
bash 复制代码
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);
6.5.2 修改表方式创建:
bash 复制代码
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);
6.5.3 创建表的时候指定索引:
bash 复制代码
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
 
##数据类型可以为 CHAR、VARCHAR 或者 TEXT
6.5.4使用全文索引查询 :
bash 复制代码
select * from 表名  where 列名='查询内容';
 
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

6.6 查看索引 :

bash 复制代码
show create table  表名;
 
 
show index from 表名;
show index from 表名\G; 竖向显示表索引信息
 
 
show keys from 表名;
show keys from 表名\G;

查看索引:

竖向查看:

6.7 删除索引:

6.7.1 直接删除索引:
bash 复制代码
DROP INDEX 索引名 ON 表名;
6.7.2 修改表方式删除索引:
bash 复制代码
ALTER TABLE 表名 DROP INDEX 索引名;
6.7.3 删除主键索引:
bash 复制代码
ALTER TABLE 表名 DROP PRIMARY KEY;

改之前:

删除主键:

没了:

总结:

① 普通索引 :针对所有字段,没有特殊的需求/规则

② 唯一索引 : 针对唯一性的字段,仅允许出现一次空值

③ 组合索引 (多列/多字段组合形式的索引)

④ 全文索引(varchar char text)MySQL为了优化对文本内容搜索的一种机制

⑤ 主键索引 :针对唯一性字段、且不可为空,同时一张表只允许包含一个主键索引

创建索引:

① 在创建表的时候,直接指定 index

② alter修改表结构的时候,进行add 添加index

③ 直接创建索引 index

PS:主键索引------》直接创建主键即可

相关推荐
松涛和鸣2 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
likangbinlxa3 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k3 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦3 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·4 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德4 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫5 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i5 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.5 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql