目录
一,索引的概念
- 索引是一个排序的列表,在这个列表中存储者索引的值和包含这个值的数据所在行的物理地址(类似于c语言的链表通过指针指向数据记录的内存地址)
- 使用索引后可以不用扫描安全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度
- 索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
- 索引是表中一列或者若干列值排序的方法
- 建立索引的目的是加快对表中记录的查找和排序
二,索引的作用
设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询的速度,这是创建索引的最主要的原因
当表很大或查询涉及多个表的时候,使用索引可以成千上万的提高查询速度
可以降低数据库的i/o成本,并且索引还可以降低数据库的排序成本
通过创建唯一(键)性索引,可以保证数据表中每一行数据的唯一性
可以加快表和表之间的连接
在使用分组和排序的时候,可大大减少分组和排序的时间。
2,索引的副作用
- 索引需要占用额外的磁盘空间。
- 对应mysql引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录地址。innodb 引擎的表数据文件本身就是索引文件。
- 数据库在执行select这类的查询语句时间,会先遍历索引表,如果无效,无用的索引,反而会增加数据库的查询消耗时间,资源消耗。
- 在插入和修改数据时要花费跟多的时间,因此索引也要随之变动
三,创建索引的原则依据
- 索引虽然可以提升数据库查询的速度,但并不是如何情况下都适合创建索引,因为索引本身会消耗系统资源,在有索引的情况下,
- 数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担
- 表的主键,外键必须有索引,因为主键具有唯一性,外键是关联的是子表的主键,查询的时刻可以快速定位。
- 记录数超过300行的表应该有索引,如果没有索引,需要把表遍历一遍,会严重影响数据库的性能。
- 经常与其他表进行连接的表,在连接字段上应该建立索引。
- 具有唯一性,同时,被查询频次较高的字段,以及表的记录行超过了300字段的表,的时候应该创建索引;
- 唯一性太差的字段不适合建立索引
- 更新太频繁的字段不适合创建索引
- 经常出现在where字句中的字段,特别是大表的字段,应该建立索引。
- 跟趋近于唯一性的字段时创建索引
- 索引应该建在选择性高的字段上
- 索引应该建立在小字段上,对应大的文本字段甚至超长字段,不要建立索引。
四,索引的分类和创建
以下的操作都基于此模板来进行操作
create database moban;
use moban
create table ky21(id int(10),name varchar(10),cardid varchar(18),phone varchar(11),address varchar(50),remark text);insert into ky21 values(1,'zhangsan','123','111111','nanjin','this is vip');
insert into ky21 values(2,'lisi','1234','222222','nanjin','this is novip');
insert into ky21 values(3,'wangwu','12345','333333','beijing','this is svip');
insert into ky21 values(4,'zhaoliu','123456','444444','sahnghai','this is ssvip');
insert into ky21 values(5,'qianqi','1234567','555555','suzhou','this is novip');
1,普通索引
1.2 直接创建索引
最基本的索引类型,没有唯一性之类的限制;
格式: create index 索引名 on 表名 (列名[(length)]);
(列名(length)): length是可选项。 如果忽略length 的值,则使用整个列的值作为索引。如果指定使用列前的length
1.3修改表方式创建
alter table 表名 add index 索引名
1.4 创建表的时候指定索引
2,唯一索引
与普通索引类似,区别是,唯一索引的每个值都是唯一
唯一索引允许有空值,如果是用组合索引创建,则列值 的组合必须唯一,添加唯一键将自动创建唯一索引。
2.1 直接创建唯一索引
create unique index 索引名 on 表名;
create unique index name_index on member(id);
2.2 修改表方式创建
alter table 表名 add unique 索引名 (列名);
2.3 创建表的时候指定
create table jiesisi(id int(4),name varchar(20),unique zz_index(id));
#创建新表test,直接创建唯一键id;show create table jisisi;
#查看索引
3,主键索引
是一种特殊的唯一索引,必须指定为"primary key",一个表只有一个主键,不允许有空值,添加主键将自动创建主键索引
mysql> create table zs11(id int primary key,name varchar(50));
mysql> create table zs11(id int primary key,name varchar(50));
mysql> create table zs11(id int primary key,name varchar(50));
mysql> create table zs11(id int primary key,name varchar(50));
3.1 修改表方式创建
mysql> alter table zs13 add primary key(name);
4,组合索引(单列索引与多列索引)
可以是单列上创建的索引,也可是是在多列上的索引
格式
create table 表名(列名1 数据类型 ,列名2 数据类型,列名3 数据类型,index index_索引名字 (列名1,列名2,列名3));
mysql> create table ap13 (id int not null,name varchar(50),cardid varchar(50),index index_ap13 (id,name));
#创建一个表,定义字段和组合索引
show create table ap13;
查看表的内容
5,全文索引
5.1 直接创建索引
适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。
全文索引可以在char,varchar或者text类型的列上创建。每个表只允许有一个全文索引。
mysql> create fulltext index index_remark on ky21(remark);
mysql> show create table ky21;
5.2 修改表方式创建
mysql> alter table ky21 add fulltext name_index(name);
show create table ky21;
5.3 创建表的方式创建索引
mysql> create table lulu11(id int(4),name varchar(40),hoppy varchar(40),fulltext index id_index(hoppy));
show create table lulu11;
5.4 使用全文索引查询
mysql> select * from ky21 where match(remark) against('this is vip');
mysql> select * from ky21 where remark='this is svip';
六,查看索引
show index from 表名;
show index from 表名\G; 竖向显示表索引信息
show keys from 表名;
show keys from 表名\G;
各字段含义如下:
table | 含义 |
Non_unique | 如果索引不能包括重复词,则为 0;如果可以,则为 1。 |
Key_name | 索引的名称。 |
Seq_in_index | 索引中的列序号,从 1 开始。 |
Column_name | 列名称。 |
Collation | 列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。 |
Cardinality | 索引中唯一值数目的估计值 |
Sub_part | 如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为 NULL。 |
Packed | 指示关键字如何被压缩。如果没有被压缩,则为 NULL。 |
Null | 如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。 |
Index_type | 用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。 |
Comment | 备注。 |
七,删除索引
7.1,直接删除索引
mysql> drop index phone_index on ky21;
7.2,修改表结构的方式删除
mysql> alter table ky21 drop index index_remark;
八,总结
索引分为:
- 普通索引:针对所以字段,没有特殊的需求/规则
- 唯一索引:针对唯一性的字段,仅允许出现一次控制
- 组合索引:多列,多字段组合形式的索引
- 全文索引:(varchar char text)
- 主键索引:针对唯一性字段,且不可为空,同时一张表只允许包含一个主键索引