索引Index
一、 索引简介
1.定义
索引
是将关键字数据以某种数据结构的方式存储到外存,用于提升数据的检索性能;索引既有逻辑上的概念,更是一种物理存储方式,且事实存在、需要耗费一定的储存空间。 经常使用表中的某一列或某几列为条件进行查询,数据量比较大时,可以创建索引,以提高查询的速度。
好比一本书的目录,通过目录快速查询
2.索引分类
类别 | 详情 |
---|---|
按数据结构分类 | B+tree索引、Hash索引、Full-text索引 |
按物理存储分类 | 聚集索引、非聚集索引(也叫二级索引、辅助索引) |
按字段特性分类 | 主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT) |
按字段个数分类 | 单列索引、联合索引(也叫复合索引、组合索引) |
2、索引优缺点
-
优点:
-
大大加快数据的检索速度(大大减少检索的数据量)-------创建索引的最主要因素
加快数据查询
-
通过建立唯一索引,保证数据的唯一性
建立唯一索引,体现数据完整性
-
帮助服务器避免排序和临时表
-
随机I/O变成顺序I/O
-
可以加速表和表质检的连接,特别是实现数据完整性方面特别有意义
体现数据的完整性
-
-
缺点:
-
创建索引和维护索引需要很多时间,这种时间随着数据量的增加而增加。
-
如果一个数据建立了索引,那么增删改这个数据,相应的索引也要进行动态修改,这将大大降低sql的执行效率。
套层修改
-
需要占用物理存储空间:索引需要使用物理文件存储,会耗费一定空间。
占用物理存储空间
-
3.索引关键字的选取原则
-
表的某个字段值离散度越高,该字段越适合选作索引的关键字。
-
占用储存空间少的字段更适合选作索引的关键字。
-
较频繁地作为where查询条件的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引。
-
更新频繁的字段不适合创建索引,不会出现在where子句中的字段不应该创建索引。
字段修改频繁不适合建立索引
-
最左前缀原则
-
尽量使用前缀索引
二、创建索引
-(创建不同种类索引,删除)
-- 查看索引
SHOW KEYS FROM table_name;
-- 删除索引,2种方式:
DROP INDEX index_name ON table_name;
alter table tb_name drop index 索引名;
-- 1. 普通索引(单列索引)
-- 单列索引是最基本的索引,它没有任何限制。 **直接创建索引**,添加索引三种方式:
CREATE INDEX index_name ON table_name(col_name);#create创建索引
ALTER TABLE table_name ADD INDEX index_name(col_name);#修改表时添加index
CREATE TABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(20) NOT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (name)
)#创建表时添加index
-- 2.复合索引:
-- 多个字段上创建的索引,复合索引遵守“最左前缀”原则,查询条件中使用了复合索引的第一个字段,索引才会被使用
create index index_name on table_name(col_name1,col_name2,...);
-- 3.唯一索引UNIQUE(主键默认有索引)
-- 列的值必须唯一,但允许存在空值
CREATE UNIQUE INDEX index_name ON table_name(col_name);
ALTER TABLE table_name ADD UNIQUE index index_name(col_name,...);
-- 4.主键索引
-- 唯一索引,一个表只能有一个主键,不允许有空值
CREATE TABLE `news` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` varchar(255) NOT NULL ,
`content` varchar(255) NULL ,
`time` varchar(20) NULL DEFAULT NULL ,
PRIMARY KEY (`id`)
)
alter table tbl_name add primary key(col_name);
-- 通过主键约束自动添加的主键索引不能用DROP INDEX语句删除,但通过唯一约束自动创建的唯一索引可以这么删除,但是删除后唯一约束也被删除了
-索引失效
- 在where后使用or,导致索引失效(尽量少用or)
- 使用like ,like查询是以%开头
- 复合索引遵守“最左前缀”原则,即在查询条件中使用了复合索引的第一个字段,索引才会被使用
- 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
- 使用in导致索引失效
- DATE_FORMAT()格式化时间,格式化后的时间再去比较,可能会导致索引失效。
段,索引才会被使用 - 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
- 使用in导致索引失效
- DATE_FORMAT()格式化时间,格式化后的时间再去比较,可能会导致索引失效。
- 对于order by、group by 、 union、 distinc 中的字段出现在where条件中时,才会利用索引!