Bootstrap

11.索引_创建不同种类索引(primary+unique+复合....)

索引Index

一、 索引简介

官网

1.定义

索引是将关键字数据以某种数据结构的方式存储到外存,用于提升数据的检索性能;索引既有逻辑上的概念,更是一种物理存储方式,且事实存在、需要耗费一定的储存空间。 经常使用表中的某一列或某几列为条件进行查询,数据量比较大时,可以创建索引,以提高查询的速度。

好比一本书的目录,通过目录快速查询

2.索引分类

类别详情
按数据结构分类B+tree索引、Hash索引、Full-text索引
按物理存储分类聚集索引、非聚集索引(也叫二级索引、辅助索引)
按字段特性分类主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)
按字段个数分类单列索引、联合索引(也叫复合索引、组合索引)

2、索引优缺点

  1. 优点:

    • 大大加快数据的检索速度(大大减少检索的数据量)-------创建索引的最主要因素

      加快数据查询

    • 通过建立唯一索引,保证数据的唯一性

      建立唯一索引,体现数据完整性

    • 帮助服务器避免排序和临时表

    • 随机I/O变成顺序I/O

    • 可以加速表和表质检的连接,特别是实现数据完整性方面特别有意义

      体现数据的完整性

  2. 缺点:

    • 创建索引和维护索引需要很多时间,这种时间随着数据量的增加而增加。

    • 如果一个数据建立了索引,那么增删改这个数据,相应的索引也要进行动态修改,这将大大降低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条件中时,才会利用索引!
;