文章目录

  • 1. 什么是索引
  • 2. 索引的特点
  • 3. 索引的分类
  • 4. 索引的设计原则
  • 5. 创建索引
    • 5.1. 自动创建索引
    • 5.2. 手动创建索引
      • 5.2.1. 创建表时创建索引
      • 5.2.2. 在已经存在的表上创建索引
        • 5.2.2.1. alter语句创建索引
        • 5.2.2.2. create语句创建索引
  • 6. 查看索引
    • 6.1. explain关键字查看索引
    • 6.2. show index关键字查看索引
  • 7. 删除索引
    • 7.1. alter关键字删除索引
    • 7.2. drop关键字删除索引

1. 什么是索引

索引是一个单独存储在磁盘上的数据库结构,它们包含着对数据表里所有记录的引用指针

在数据库中,索引用来加速对表的查询,索引技术通过使用快速路径访问的方法快速定位数据,减少了磁盘的I/O

可以把索引比作书的目录,每一张表都要有索引,就像每一本书都应该有目录一样。有了索引,数据库的检索速度可以大大提高

2. 索引的特点

索引是作用于表查询的一项技术,因此创建索引时,需要确保该索引是应用在SQL查询语句的条件,一般作为where子句的条件。

在表现形式上,索引表现为一张表,该表保存了主键与索引字段,并指向实体表的记录。索引独立于数据表存放,但不能独立存在,必须属于某个表。索引由数据库自动维护,数据表被删除时,该表上的索引自动被删除。

不过需要注意的是,虽然索引极大地提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete的速度会被降低。 因为更新表时,数据库不仅需要更新表数据,还要更新索
引文件,此外由于索引是独立于表存在的“表”,因此建立索引会占用一定的磁盘空间。

3. 索引的分类

  1. 普通索引
    最基本的索引,它没有任何限制,用于加速查询
  2. 唯一索引(unique)
    索引列的值必须唯一,但允许有空值。如果是组合索列值的组合必须唯一
  3. 主键索引(primary key)
    是一种特殊的唯 一索引,一个表只能有一个主键,不允许有空值,主键索引一般是在表建立的同时自动创建
  4. 单列索引
    指单个字段上创建索引
  5. 组合索引
    指条个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合的规则
  6. 全文索引(fulltext)
    该索引不直接与索引中的值相比较,而是查找文本中的关键字
  7. 空间索引(spatial)
    MySQL 5.7.4实验室版本中,InnoDB存储引擎新增了对于几何数据空间索引的支持

4. 索引的设计原则

设计索引应遵循如下原则:

  1. 只建立适量的索引。 索引并非越多越好,过多的索引会降低表的修改速度以及占用额外的存储空间。
  2. 只在需要大量查询的表中建立大量索引。 应该避免对经常更新的表进行过多的索引,并且索引中的列要尽可能少。
  3. 不在数据量小的表建立索引。 数据量小的表没有必要使用索引
  4. 不在不同值少的列上建立索引。 如果表的某一列中大部分数据都是重复的,则没有必要建立索引
  5. 指定唯一索引。 当表的某一列数据被指定为unique是,可以建立唯一索引
  6. 在频繁操作的列上建立索引。 若想要建立索引,则应选择频繁排序(order by)或分组(group by)的列建立索引

5. 创建索引

5.1. 自动创建索引

当在表上定义primary key或者unique约束条件时,数据库会自动创建一个对应的索引,也就是创建主键索引和唯一索引。

5.2. 手动创建索引

5.2.1. 创建表时创建索引

在建表的同时创建索引的语法为:

create table [表名]([属性名1] [数据类型1] [约束1],...[属性名n] [数据类型n] [约束n],[unique | fulltext | spatial] index|key [索引名]([属性名1] [(长度)] [asc | desc],...[属性名n] [(长度)] [asc | desc])
);

例如
建立普通索引

create table normal_table(id int(20) primary key,username varchar(20),email varchar(20),-- 在id列建立普通索引index normal_index(id)
);

建立唯一索引

create table unique_table(id int(20) primary key,username varchar(20),email varchar(20),-- 在email列建立唯一索引,并升序排列unique index uniquel_index(email asc)
);

建立全文索引

create table fulltext_table(id int(20) primary key,username varchar(20),email varchar(20),-- 在username列建立全文索引fulltext index fulltext_index(username)
);

建立单列索引

create table single_table(id int(20) primary key,username varchar(20),email varchar(20),-- 在username列建立索引,索引长度为9index single_index(username(9))
);

建立多列索引

create table multi_table(id int(20) primary key,username varchar(20),email varchar(20),-- 在username列和email列建立索引,索引长度分别为9和10index multi_index(username(9),email(10))
);
5.2.2. 在已经存在的表上创建索引
5.2.2.1. alter语句创建索引

语法:

alter table [表名] add [unique|fulltext|spatial] [index|key] [索引名]([属性名1] [(长度)] [asc | desc],...[属性名n] [(长度)] [asc | desc]);

例如:
建立普通索引

-- 在normal_table表的id列建立名为normal_index的普通索引
alter table normal_table add index normal_index(id);

建立唯一索引

-- 在unique_table表的username列建立名为unique_index的唯一索引
alter table unique_table add unique index unique_index(username);

建立多列索引

-- 在multi_table表的username和email列建立名为multi_index的多列索引
alter table multi_table add index multi_index(username, email);

其他类型的索引同理

5.2.2.2. create语句创建索引

语法:

create unique [unique|fulltext|spatial] index [索引名] ON [表名]([属性名1] [(长度)] [asc | desc],...[属性名n] [(长度)] [asc | desc]);

例如
建立普通索引

-- 在normal_table表的id列建立名为normal_index的普通索引
create index normal_index on normal_table(id);

建立唯一索引

-- 在unique_table表的username列建立名为unique_index的唯一索引
create unique index unique_index on unique_table(username);

建立多列索引

-- 在multi_table表的username和email列建立名为multi_index的多列索引
create index multi_table on multi_table(username, email);

其他类型的索引同理

6. 查看索引

6.1. explain关键字查看索引

explain关键字用于查看和分析SQL索引使用情况
语法:

explain select * from [表名];

使用里explain语句后,会返回一张表:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra

其中对表中字段的说明可以参考这篇博客:mysql中explain查看sql语句索引使用情况

例如:

-- 查看multi_table表中的所有使用情况
explain select * from multi_table;

结果为:

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE multi_table index multi_table2 166 1 100.00 Using index

6.2. show index关键字查看索引

show index关键字用于查看某一表中的所有索引
语法:

show index from [表名];

使用里show index语句后,会返回一张表:

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression

其中对表中字段的说明可以参考这篇博客:MySQL SHOW INDEX 的语法解析

例如:

-- 查看multi_table表中的全部索引
show index from multi_table;

结果为:

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment Visible Expression
multi_table 0 PRIMARY 1 id A 0 BTREE YES
multi_table 1 multi_index 1 username A 0 9 YES BTREE YES
multi_table 1 multi_index 2 email A 0 10 YES BTREE YES
multi_table 1 multi_table2 1 username A 0 YES BTREE YES
multi_table 1 multi_table2 2 email A 0 YES BTREE YES

7. 删除索引

7.1. alter关键字删除索引

语法:

alter table [表名] drop index [索引名];

例如

-- 从multi_table表中删除multi_index索引
alter table multi_table drop index multi_index;

7.2. drop关键字删除索引

语法:

drop index [索引名] on [表名];

例如

-- 从multi_table表中删除multi_index索引
drop index multi_index on multi_table;

SQL 如何建立索引来加快数据库的查询相关推荐

  1. hive能加快MySQL查询速度吗_建立索引可以加快表中数据查询的速度吗

    首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合. 如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特 ...

  2. mysql建立索引 性能测试_mysql数据库索引的建立以及性能测试

    ##---------mysql学习(四)索引的建立--------### #今天突然开窍了,所以补充点索引方面的知识. #创建索引,这里仍然以数据较少的mytab表为例: #原数据为: mysql& ...

  3. oracle的clob建立索引,oracle clob类型字段查询方法

    今天要查询clob类型字段为空的记录.颇费一番周折才找到一个方法,记录以供参考. select s.testcaseid from b_t_testcasestepinfo s where pjid ...

  4. MySQL索引优化:哪些情况下需要建立索引(适合构建索引的几种情况)

    适合构建索引的几种情况: 引言 我们知道正确的建立索引可以加快数据库的查询,但是如果索引建立不当,或者随意的建立过多索引不仅不会提升数据库的效率,反而在进行数据更新操作的时候需要耗费系统资源对索引进行 ...

  5. MySQL数据库:SQL优化与索引优化

    一.索引优化: 1.like语句的前导模糊查询不使用索引: select * from doc where title like '%XX':   --不能使用索引 select * from doc ...

  6. 数据库建立索引、数据表创建规则、备用字段 / 保留字段 / 预留字段

    数据库建立索引 数据库.数据表建立索引的原则 数据库建立索引的原则 1,确定针对该表的操作是大量的查询操作还是大量的增删改操作. 2,尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在w ...

  7. sql server 创建唯一性非聚集索引语句_数据库专题—索引原理

    深入浅出数据库索引原理 参见:https://www.cnblogs.com/aspwebchh/p/6652855.html 1.为什么给表加上主键? 1.平时创建表的时候,都会给表加上主键.如果没 ...

  8. 如何在ORACLE数据库的字段上建立索引?

    Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名); 例如: create index index_userid on tbl_detail(userid) ...

  9. 数据库建立索引的优缺点

    索引就像是书的目录,是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引中包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(BTree)中,使SQL可以快速有效地查找与键值关 ...

最新文章

  1. Struts2学习小结
  2. 微软聘请游说公司为收购雅虎作势
  3. 状态图和活动图的区别
  4. python【蓝桥杯vip练习题库】ALGO-70最长字符串
  5. php云和骑士哪家好,PHP云人才系统与骑士cms人才系统对比点评
  6. mysql 整数_MySQL 整数(int)数据类型
  7. Centos7-Lvs+Keepalived架构实验详解
  8. 多关卡连连看php源码_奇怪的连连看ios版是一款非常好玩的手机消除闯关游戏,奇怪的连连看采用了最经典的三消玩法,游戏中有着非常多的游戏关卡,是一...
  9. Windows多线程应用程序的编译和链接
  10. openssl 升级到OpenSSL 1.0.1g 修复HEARTBEATS漏洞
  11. linux查看行数命令 set,Linux显示文件行数之nl命令详解
  12. (实战项目二)阳光热线问政平台
  13. 【大学物理·早期通子论和量子力学基础】德布罗意波微观粒子的波粒二象性
  14. 互联网晚报 | 06月07日 星期二 | 杭州调整住房公积金政策;苹果发布iOS 16;特斯拉回应裁员是否涉及中国地区...
  15. 应用程序如何隐藏标题栏
  16. 批量缩小多张图片尺寸,保持图片清晰无损
  17. Qml控件之Calendar日历
  18. 中国有望成为世界第一个发射量子轨道卫星的国家
  19. typeof(undefined) == undefined 成立吗?
  20. 《微机原理及应用》 试题

热门文章

  1. 17届学长分享:如何集齐BAT三家offer
  2. 模拟form提交表单
  3. vim复制时不复制行号
  4. python60行绘图程序_天底下最简单的QT画图板,就一个类,60行代码
  5. 汉诺塔递归的空间复杂度_学习算法绕不开的~~汉诺塔
  6. 你真的需要一个(专门的)向量数据库么
  7. 磁盘管理命令之partx,lsblk,blkid,partprobe
  8. xvfb与x11vnc
  9. 一张图看懂DNS域名解析全过程
  10. 上手Coc.nvim 完全指南