索引是数据库管理系统中用于提高查询速度的一种数据结构。在MySQL中,索引可以看作是一种特殊的表,其中包含了对数据表中特定列的值及其在数据表中的位置信息。通过使用索引,MySQL可以在不需要扫描整个表的情况下快速找到与查询条件匹配的记录。
常见索引分为:
(1)类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本
,这也是创建索引最主要的原因。
(2)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
。
(3)在实现数据的参考完整性方面,可以加速表和表之间的连接
。换句话说,对于有依赖关系的子表和父表联合查询时,可以提高查询速度。
(4)在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间
,降低了CPU的消耗。
(1)创建索引和维护索引要耗费时间
,并且随着数据量的增加,所耗费的时间也会增加。
(2)索引需要占磁盘空间
,除了数据表占数据空间之外,每一个索引还要占一定的物理空间存储在磁盘上
,如果有大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸。
(3)虽然索引大大提高了查询速度,同时却会降低更新表的速度
。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。
通过键值,Mysql进行自动排序,可以很方便引入目录。
存在一个目录页来管理页目录,目录页中的数据存放的就是指向的那一页中最小的数据。有数据,就可通过比较,找到该访问那个Page ,进而通过指针,找到下一个 Page 。其实目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是普通页的地址。
下图是InnoDB 的索引结构---B+树,以此来管理数据。
B树的结构:
为何选择B+?
MyISAM 最大的特点是,将索引Page和数据Page分离,也就是叶子节点没有数据,只有对应数据的地址。 其中, MyISAM 这种用户数据与索引数据分离的索引方案,叫做非聚簇索引。
相较于 InnoDB 索引, InnoDB 是将索引和数据放在一起的。 其中, InnoDB 这种用户数据与索引数据在一起索引方案,叫做聚簇索引 。
MySQL 除了默认会建立主键索引外,我们用户也有可能建立按照其他列信息建立的索引,一般这种索引可以叫做辅助(普通)索引。对于 MyISAM , 建立辅助(普通)索引和主键索引没有差别,无非就是主键不能重复,而非主键可重复。
-- 在创建表的时候,直接在字段名后指定 primary keycreate table user1(id int primary key, name varchar(30));
-- 在创建表的最后,指定某列或某几列为主键索引create table user2(id int, name varchar(30), primary key(id));
create table user3(id int, name varchar(30));-- 创建表以后再添加主键alter table user3 add primary key(id);
主键索引的特点:
-- 在表定义时,在某列后直接指定 unique 唯一属性。create table user4(id int primary key, name varchar(30) unique);
-- 创建表时,在表的后面指定某列或某几列为 uniquecreate table user5(id int primary key, name varchar(30), unique(name));
create table user6(id int primary key, name varchar(30) );alter table user6 add unique(name);
唯一索引的特点:
create table user8(id int primary key,name varchar(20),email varchar(30),index(name) -- 在表的定义最后,指定某列为索引);
create table user9(id int primary key, name varchar(20), email varchar(30));alter table user9 add index(name); -- 创建完表以后指定某列为普通索引
create table user10(id int primary key, name varchar(20), email varchar(30));-- 创建一个索引名为 idx_name 的索引create index idx_name on user10(name);
普通索引的特点:
CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,title VARCHAR(200),body TEXT,FULLTEXT (title,body))engine=MyISAM;
第一种方法: show keys from 表名;第二种方法: show index from 表名 ;第三种方法: desc 表名;
第一种方法 - 删除主键索引: alter table 表名 drop primary key ;第二种方法 - 其他索引的删除: alter table 表名 drop index 索引名; 索引名就是 show keys from 表名中的 Key_name 字段 alter table user10 drop index idx_name ;第三种方法方法: drop index 索引名 on 表名 drop index name on user8;