1.什么是索引,为什么使用索引:
1.1什么是索引:
数据库对象索引其实和书的目录非常类似
索引是创建在数据库对象上的,由表的一个字段或多个字段生成的键组成
这些键存储在数据结构(B-树或哈希表)中
1.2索引类型:
根据存储类型索引分为乙型树索引(BTREE)和哈希索引(HASH)
InnoDB的的和MyISAM数据的存储引擎支持BTREE类型索引,MEMORY存储引擎支持HASH类型索引
MySQL的的支持6种索引:普通索引,唯一索引,全文索引,单列索引,多列索引和空间索引
1.3为什么使用索引:
索引可以提高查询速度,但是过多的索引则会占据许多磁盘空间
1.4哪些情况适合,哪些情况不适合创建索引:
1.4.1适合的情况:
经常被查询的字段,即在WHERE子句中出现的字段
在分组的字段中,即在GROUP BY子句中出现的字段
存在依赖关系的子表和父表之间的联合查询,即主键或外键字段
设置唯一完整性约束的字段
1.4.2不适合的情况:
在查询中很少被使用的字段
拥有许多重复的字段
2.创建和查看索引:
在MySQL中,可以通过三种方式创建索引,分别为创建表时创建索引,在已经存在的表上创建索引并通过SQL语句ALTER TABLE创建索引
2.1创建和查看普通索引:
2.1.1创建表时创建普通索引:
CREATE TABLE table_name(
属性名数据类型,
属性名数据类型,
属性名数据类型,
INDEX | KEY [索引名](属性名1 [(长度)] [ASC | DESC])
);
INDEX或KEY参数用来指定字段为索引,“长度”参数用来指定索引的长度
不同的存储引擎定义了表的最大索引数和最大索引长度
MySQL的所支持的存储引擎对每个表至少支持16个索引,总索引长度至少为256字节
在创建完索引之后可以执行SQL语句EXPLAIN查看索引是否被使用,例如:
EXPLAIN SELECT * FROM t_dept WHERE deptno = 1;
由于possible_keys和密钥字段处的值都为索引名,这说明索引存在而且开始使用
也可以通过SHOW CREATE TABLE table_name;查看索引是否被创建
2.1.2在已经存在的表上创建普通索引:
CREATE INDEX索引名
ON表名(属性名[(长度)] [ASC | DESC]);
2.1.3通过SQL语句ALTER TABLE创建普通索引:
ALTER TABLE table_name
ADD INDEX | KEY索引名(属性名[(长度)] [ASC | DESC]);
2.2创建和查看唯一索引:
唯一索引就是在创建索引时限制索引的值必须是唯一的
MySQL的中根据创建索引方式,可以分为自动索引和手动索引
自动索引:指在数据库表里设置完整性约束时,该表会系统自动创建索引
手动索引:指手动在表上创建索引
2.2.1创建表时创建唯一索引:
CREATE TABLE table_name(
属性名数据类型,
属性名数据类型,
属性名数据类型,
UNIQUE INDEX | KEY [索引名](属性名1 [(长度)] [ASC | DESC])
);
2.2.2在已经存在的表上创建唯一索引:
CREATE UNIQUE INDEX索引名
ON表名(属性名[(长度)] [ASC | DESC]);
2.2.3通过SQL语句ALTER TABLE创建唯一索引:
ALTER TABLE table_name
ADD UNIQUE INDEX | KEY(属性名[(长度)] [ASC | DESC]);
2.3创建和查看全文索引:
全文索引主要关联在数据类型为CHAR,VARCHAR,和TEXT的字段上,以便能够更加快速地查询数据量较大的字符串类型字段
只能在存储引擎为MyISAM的数据库表上创建全文索引
全文索引的搜索执行方式为不区分大小写,如果有关联二进制数据类型则区分大小写
2.3.1创建表时创建全文索引:
CREATE TABLE table_name(
属性名 数据类型,
属性名 数据类型,
属性名 数据类型,
FULLTEXT INDEX|KEY [索引名] (属性名1 [(长度)] [ASC|DESC])
);
2.3.2在已经存在的表上创建全文索引:
CREATE FULLTEXT INDEX 索引名
ON 表名 (属性名 [(长度)] [ASC]DESC);
2.3.3通过SQL语句ALTER TABLE创建全文索引:
ALTER TABLE table_name
ADD FULLTEXT INDEX|KEY [索引名] (属性名1 [(长度)] [ASC|DESC]);
2.4创建和查看多列索引:
指在创建索引时,所关联的字段不是一个字段,而是多个字段
查询时,只有查询条件中使用了所关联字段中的第一个字段,多列索引才会被使用
2.4.1创建表时创建多列索引:
CREATE TABLE table_name(
属性名 数据类型,
属性名 数据类型,
属性名 数据类型,
INDEX|KEY [索引名] (属性名1 [(长度)] [ASC|DESC],
......
属性名n [(长度)] [ASC | DESC])
);
2.4.2在已经存在的表上创建多列索引:
CREATE TABLE table_name
ON表名(属性名[(长度)] [ASC | DESC],
......
属性名n [(长度)] [ASC | DESC]);
2.4.3通过SQL语句ALTER TABLE创建多列索引:
ALTER TABLE table_name
ADD INDEX | KEY索引名(属性名[(长度)] [ASC | DESC],
......
属性名n [(长度)] [ASC | DESC]);
3.删除索引:
DROP INDEX index_name
ON table_name;