索引Index
 
 
文章目录
- 索引`Index`
- 一、 索引简介
- 1.定义
- 2.索引分类
- 2、索引优缺点
- 3.索引关键字的选取原则
 
- 二、创建索引
- -(创建不同种类索引,删除)
- -索引失效
 
 
一、 索引简介
官网
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条件中时,才会利用索引!