MySQL数据库索引

索引的定义

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

索引的作用

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

索引的副作用

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

索引的工作方式

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

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

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

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

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

索引的类型
  1. 普通索引
bash 复制代码
create index 索引名 on 表名 (字段);
#直接创建索引
alter table 表名 add index 索引名 (字段);
#修改表方式创建索引
  1. 唯一索引
bash 复制代码
create unique index 索引名 on 表名 (字段);
#直接创建唯一索引
alter table 表名 add unique 索引名 (字段);
#修改表方式创建
  1. 主键索引
bash 复制代码
create table 表名 ([...],primary key (字段));
#创建表的时候指定
alter table 表名 add primary key (字段);
#修改表方式创建
  1. 主键索引
bash 复制代码
create index 索引名 on 表名 (字段1, 字段2, ....);
alter table 表名 add index 索引名 (字段1, 字段2, ....);

例:
create unique index 索引名 on 表名 (字段1, 字段2, ....);
alter table 表名 add unique 索引名 (字段1, 字段2, ....);
select .... from 表名 where 字段1=XX and 字段2=XX ... ;
#用 and 做逻辑运算符多字段查询时,要创建组合索引且要满足最左原则
#用 or 做逻辑运算符多字段查询时,所有字段都要单独创建单列索引
  1. 全文索引
bash 复制代码
create fulltext index 索引名 on 表名 (字段);
#直接创建索引
alter table 表名 add fulltext 索引名 (字段);
#修改表方式创建

#支持模糊查询
select .... from 表名 where match(字段) against('单词');
查看索引
bash 复制代码
show index from 表名;
show keys from 表名;
删除索引
bash 复制代码
drop index 索引名 on 表名;
#直接删除索引
alter table 表名 drop primary key;
#修改表方式删除索引
alter table 表名 drop primary key;
#删除主键索引

例:

比如为某商场做一个会员卡的系统。这个系统有一个会员表,有下列字段:

会员编号 int

会员姓名 varchar(10)

会员身份证号码 int(18)

会员电话 int(11)

会员住址 varchar(50)

会员备注信息 text

mysql命令:

create table member (id int(10),name varchar(10),cardid varchar(10),phone int(11),address varchar(50),remark text);

alter table member add primary key (id);

#会员编号,作为主键,使用primary key

create index name_index on member (name);

#会员姓名,如果要建索引的话,那么就是普通的index

create unique index cardid_index on member(cardid);

#会员身份证号码,如果要建索引的话,那么可以选择unique(唯一的,不允许重复)

alter table member add fulltext remark_index (remark);

#会员备注信息,如果需要建索引的话,可以选择fulltext,全文搜索

#不过fulltext用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的index也可以

字段含义
字段 含义
table 表的名称
non_name 如果索引不能包括重复词,则为0;如果可以,则为1
key_name 索引的名称
seq_in_index 索引中的列序号,从1开始
column_name 列名称
collation 列以什么方式存储在索引中。在MySQL中,有值'A'(升序)或NULL(无分类)
cardinality 索引中唯一值数目的估计值
sub_part 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL
pacted 指示关键字如何被压缩。如果没有被压缩,则为NULL
null 如果列含有NULL,则含有YES。如果没有,则该列含有NO
index_type 用过的索引方法(btree, fulltext, hash,rtree)
comment 备注
相关推荐
夜泉_ly2 小时前
MySQL -安装与初识
数据库·mysql
qq_529835353 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New5 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6755 小时前
数据库基础1
数据库
我爱松子鱼5 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo6 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser7 小时前
【SQL】多表查询案例
数据库·sql
Galeoto7 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)7 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231117 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql