SQL 如何建立索引来加快数据库的查询
文章目录
- 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. 索引的分类
- 普通索引
最基本的索引,它没有任何限制,用于加速查询 - 唯一索引(unique)
索引列的值必须唯一,但允许有空值。如果是组合索列值的组合必须唯一 - 主键索引(primary key)
是一种特殊的唯 一索引,一个表只能有一个主键,不允许有空值,主键索引一般是在表建立的同时自动创建 - 单列索引
指单个字段上创建索引 - 组合索引
指条个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合的规则 - 全文索引(fulltext)
该索引不直接与索引中的值相比较,而是查找文本中的关键字 - 空间索引(spatial)
MySQL 5.7.4实验室版本中,InnoDB存储引擎新增了对于几何数据空间索引的支持
4. 索引的设计原则
设计索引应遵循如下原则:
- 只建立适量的索引。 索引并非越多越好,过多的索引会降低表的修改速度以及占用额外的存储空间。
- 只在需要大量查询的表中建立大量索引。 应该避免对经常更新的表进行过多的索引,并且索引中的列要尽可能少。
- 不在数据量小的表建立索引。 数据量小的表没有必要使用索引
- 不在不同值少的列上建立索引。 如果表的某一列中大部分数据都是重复的,则没有必要建立索引
- 指定唯一索引。 当表的某一列数据被指定为unique是,可以建立唯一索引
- 在频繁操作的列上建立索引。 若想要建立索引,则应选择频繁排序(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 | A | 0 | 10 | YES | BTREE | YES | |||||
multi_table | 1 | multi_table2 | 1 | username | A | 0 | YES | BTREE | YES | |||||
multi_table | 1 | multi_table2 | 2 | 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 如何建立索引来加快数据库的查询相关推荐
- hive能加快MySQL查询速度吗_建立索引可以加快表中数据查询的速度吗
首先明白为什么索引会增加速度,DB在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合. 如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特 ...
- mysql建立索引 性能测试_mysql数据库索引的建立以及性能测试
##---------mysql学习(四)索引的建立--------### #今天突然开窍了,所以补充点索引方面的知识. #创建索引,这里仍然以数据较少的mytab表为例: #原数据为: mysql& ...
- oracle的clob建立索引,oracle clob类型字段查询方法
今天要查询clob类型字段为空的记录.颇费一番周折才找到一个方法,记录以供参考. select s.testcaseid from b_t_testcasestepinfo s where pjid ...
- MySQL索引优化:哪些情况下需要建立索引(适合构建索引的几种情况)
适合构建索引的几种情况: 引言 我们知道正确的建立索引可以加快数据库的查询,但是如果索引建立不当,或者随意的建立过多索引不仅不会提升数据库的效率,反而在进行数据更新操作的时候需要耗费系统资源对索引进行 ...
- MySQL数据库:SQL优化与索引优化
一.索引优化: 1.like语句的前导模糊查询不使用索引: select * from doc where title like '%XX': --不能使用索引 select * from doc ...
- 数据库建立索引、数据表创建规则、备用字段 / 保留字段 / 预留字段
数据库建立索引 数据库.数据表建立索引的原则 数据库建立索引的原则 1,确定针对该表的操作是大量的查询操作还是大量的增删改操作. 2,尝试建立索引来帮助特定的查询.检查自己的sql语句,为那些频繁在w ...
- sql server 创建唯一性非聚集索引语句_数据库专题—索引原理
深入浅出数据库索引原理 参见:https://www.cnblogs.com/aspwebchh/p/6652855.html 1.为什么给表加上主键? 1.平时创建表的时候,都会给表加上主键.如果没 ...
- 如何在ORACLE数据库的字段上建立索引?
Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名); 例如: create index index_userid on tbl_detail(userid) ...
- 数据库建立索引的优缺点
索引就像是书的目录,是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引中包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(BTree)中,使SQL可以快速有效地查找与键值关 ...
最新文章
- Struts2学习小结
- 微软聘请游说公司为收购雅虎作势
- 状态图和活动图的区别
- python【蓝桥杯vip练习题库】ALGO-70最长字符串
- php云和骑士哪家好,PHP云人才系统与骑士cms人才系统对比点评
- mysql 整数_MySQL 整数(int)数据类型
- Centos7-Lvs+Keepalived架构实验详解
- 多关卡连连看php源码_奇怪的连连看ios版是一款非常好玩的手机消除闯关游戏,奇怪的连连看采用了最经典的三消玩法,游戏中有着非常多的游戏关卡,是一...
- Windows多线程应用程序的编译和链接
- openssl 升级到OpenSSL 1.0.1g 修复HEARTBEATS漏洞
- linux查看行数命令 set,Linux显示文件行数之nl命令详解
- (实战项目二)阳光热线问政平台
- 【大学物理·早期通子论和量子力学基础】德布罗意波微观粒子的波粒二象性
- 互联网晚报 | 06月07日 星期二 | 杭州调整住房公积金政策;苹果发布iOS 16;特斯拉回应裁员是否涉及中国地区...
- 应用程序如何隐藏标题栏
- 批量缩小多张图片尺寸,保持图片清晰无损
- Qml控件之Calendar日历
- 中国有望成为世界第一个发射量子轨道卫星的国家
- typeof(undefined) == undefined 成立吗?
- 《微机原理及应用》 试题