4 MySQL学习---MySQL索引( 四 )


按表列属性分类,有以下几种索引类型:
普通索引(Key)作为MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值 。
唯一索引(Unique)索引列的值必须有值且不能重复 , 但允许空值 。语法如下:
# 随表一起建立唯一索引# 唯一索引时必须保证所有的值是唯一的(除了null),若有重复数据,会报错create table user (uid int(10) unsigned auto_increment,name varchar(50) not null,gender int(2) not null,primary key(uid),KEY(name),unique(gender));# 单独建立唯一索引Ccreate unique index idx_gender on user(gender);# 删除唯一索引drop index idx_gender on user;主键索引主键索引是唯一的,通常以表的ID设置为主键索引,一个表只能有一个主键索引 , 这是它跟唯一索引的区别 。语法如下:
# 随表一起建立主键索引create table user (uid int(10) unsigned auto_increment,name varchar(50) not null,gender int(2) not null,primary key(uid));create table user2 (uid int(10) unsigned,name varchar(50) not null,gender int(2) not null,primary key(uid));# 单独建立主键索引alter table user add primary key user(name);# 删除主键索引alter table user drop primary key;# 修改主键索引# 必须先删除掉(drop)原索引,再新建(add)索引全文索引(FULLTEXT)全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值 。全文索引可以在char、varchar或者text类型的列上创建 。
空间索引(SPATIAL)空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有4种,分别是geometry、point、linestring和polygon 。MySQL使用SPATIAL关键字进行扩展 , 使得能够用于创建正规索引类似的语法创建空间索引 。创建空间索引的列必须声明为NOT NULL 。
按索引列的数量分类,有以下几种索引类型:
单列索引单列索引即一个索引只包含单个列 , 一个表中可以有多个单列索引 。语法如下:
# 随表一起建立单列索引 。索引名同列名(name)create table user (uid int(10) unsigned auto_increment,name varchar(50) not null,gender int(2) not null,primary key(uid),key(name));# 单独建立单列索引create index idx_name on user(name);# 删除单列索引drop index idx_name;联合索引/复合索引联合索引即一个索引中包含多个列,在数据库操作期间,联合索引所需要的开销更?。ㄏ喽杂谙嗤亩喔隽薪⒌ブ邓饕?。语法如下:
# 随表一起建立联合索引create table user (uid int(10) unsigned auto_increment,name varchar(50) not null,gender int(2) not null,primary key(uid),key(name),unique(gender),key(name,gender));# 单独建立联合索引create index idx_name_gender on user(name,gender);# 删除联合索引drop index idx_name_gender on user;按存储结构分类,有以下几种索引类型:
聚簇索引/聚集索引(Primary Key)InnoDB引擎中的聚簇索引通常由主键或非空唯一索引来实现的 , 实际上是在叶子节点中同时存储了索引和整行数据,通过该索引查询可以直接获取查询数据行 。
与MYISAM引擎不同,InnoDB的数据文件本身就是索引文件 , 表数据文件本身就是按照B+组织的一个索引结构,其叶子节点的键值就是表的主键 , 这种数据存储方式也被称为聚簇索引 。由此可见,聚簇索引并不是一种单独的索引类型,而是一种数据存储方式 。
聚簇索引的叶子节点都包含主键值、事务ID、用于事务MVCC的回滚指针以及所有的剩余列 。
注:InnoDB存储引擎的表会存在主键(唯一且非空),如果建表的时候没有指定主键,则会使用第一个非空的唯一索引作为聚集索引,否则InnoDB会自动帮你创建一个不可见的、长度为6字节的row_id用来作为聚集索引 。
非聚簇索引/辅助索引/二级索引非聚簇索引也叫辅助索引、二级索引等,叶子节点存储索引值和主键值 。当需要访问数据时,根据主键从聚簇索引中查询 。
与MYISAM引擎的辅助索引实现不同,InnoDB的辅助索引 , 其叶子节点存储的不是行指针而是主键值 , 得到主键值再要查询具体行数的话,要去聚簇索引中再查找一次,也叫回表 。这样的策略优势是减少了当出现行移动或者数据页分裂时二级索引的维护工作 。
索引的创建原则