MySQL数据库索引

索引的定义

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

索引的作用

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

索引的副作用

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

索引的工作方式

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

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

创建索引的依据
  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. 主键索引

create table 表名 ([...],primary key (字段));
#创建表的时候指定
alter table 表名 add primary key (字段);
#修改表方式创建

4. 主键索引

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 做逻辑运算符多字段查询时,所有字段都要单独创建单列索引

5. 全文索引

create fulltext index 索引名 on 表名 (字段);
#直接创建索引
alter table 表名 add fulltext 索引名 (字段);
#修改表方式创建

#支持模糊查询
select .... from 表名 where match(字段) against('单词');
查看索引
show index from 表名;
show keys from 表名;
删除索引
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 备注

相关推荐

  1. MySQL数据库索引

    2023-12-29 09:44:05       37 阅读
  2. MySQL数据库索引介绍

    2023-12-29 09:44:05       17 阅读
  3. 数据库MySQL索引事务

    2023-12-29 09:44:05       15 阅读
  4. Mysql数据库索引

    2023-12-29 09:44:05       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 09:44:05       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 09:44:05       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 09:44:05       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 09:44:05       18 阅读

热门阅读

  1. Presentation Error:编程中的细节之战

    2023-12-29 09:44:05       31 阅读
  2. 获取请求的真实ip

    2023-12-29 09:44:05       34 阅读
  3. opencv c++圆检测

    2023-12-29 09:44:05       38 阅读
  4. Docker Compose容器编排实战

    2023-12-29 09:44:05       31 阅读
  5. PHP:服务器端脚本语言的瑰宝

    2023-12-29 09:44:05       30 阅读
  6. axios如何在vue中使用

    2023-12-29 09:44:05       33 阅读
  7. 基于技能的简历:求职的战略方法

    2023-12-29 09:44:05       40 阅读
  8. 在简历中评价和体现技能水平的最佳方式

    2023-12-29 09:44:05       37 阅读
  9. vue3面试题

    2023-12-29 09:44:05       31 阅读
  10. (Qt) 预编译头文件precompile_header

    2023-12-29 09:44:05       35 阅读
  11. 短剧风吹到游戏:网易、完美世界前赴后继

    2023-12-29 09:44:05       29 阅读
  12. Tor网络-洋葱网络(匿名通信的网络)学习记录-简介

    2023-12-29 09:44:05       111 阅读