好程序员Java分享SQL语言之索引,前言:本章咱们将学习MySQL中的索引,本文将从索引的做用、索引的分类、建立索引的语法、索引的使用策略以及索引的实现原理等方面带你们了解索引。程序员
索引的做用就是加快查询速度,若是把使用了索引的查询看作是法拉利跑车的话,那么没有用索引的查询就至关因而自行车。目前实际项目中表的数据量愈来愈大,动辄上百万上千万级别,没有索引的查询会变得很是缓慢,使用索引成为了查询优化的必选项目。数据库
索引实际上是一种特殊的数据,也保存在数据库文件中,索引数据保存着数据表中实际数据的位置。相似书籍前面的目录,这个目录就保存了书中各个章节的页数,经过查看目录咱们能够快速定位章节的页数,从而加快查找速度。数据结构
咱们来看一段查询语句:函数
select * from book where id = 1000000;学习
假设书籍表中有几百万行数据,没索引的查询会遍历前面的100万行数据找到结果,若是咱们在id上创建主键索引,则直接在索引上定位结果,速度要快得多。优化
优势:提升查询速度spa
缺点:自己也是数据,会占用磁盘空间;索引的建立和维护也须要时间成本;进行删除、更新和插入操做时,由于要维护索引,因此速度会下降。3d
建立索引指针
建表的同时建立索引blog
create table 表名
(
字段名 类型,
...
字段名 类型,
index 索引名称 (字段名)
);
建表后添加索引
alter table 表名 add index 索引名(字段名);
或
create index 索引名 on 表名(字段名);
删除索引
alter table 表名 drop index 索引名;
或
drop index 索引名 on 表名;
查看表中的索引
show index from 表名;
查看查询语句使用的索引
explain 查询语句;
索引按功能分为:
普通索引,在普通字段上创建的索引,没有任何限制
主键索引,建立主键时,自动建立的索引,不能为空,不能重复
惟一索引,创建索引的字段数据必须是惟一的,容许空值
全文索引,在大文本类型(Text)字段上创建的索引
组合索引,组合多个列建立的索引,多个列不能有空值
代码示例:
-- 建立书籍表
create table tb_book
(
-- 建立主键索引
id int primary key,
-- 建立惟一索引
title varchar(100) unique,
author varchar(20),
content Text,
time datetime,
-- 普通索引
index ix_title (title),
-- 全文索引
fulltext index ix_content(content),
-- 组合索引
index ix_title_author(title,author)
);
-- 建表后添加主键索引
ALTER TABLE tb_book ADD PRIMARY KEY pk_id(id);
-- 建表后添加惟一索引
ALTER TABLE tb_book ADD UNIQUE index ix_title(title);
-- 建表后添加全文索引
ALTER TABLE tb_book ADD FULLTEXT index ix_content(content);
-- 查询时使用全文索引
SELECT * FROM tb_book MATCH(content) ANGAINST(‘胜利’);
-- 建表后添加组合索引
ALTER TABLE tb_book ADD INDEX ix_book(title,author);
注意:建立组合索引时,要遵循”最左前缀”原则,把最常查询、排序的字段放左边,按重要性依次递减。
什么状况下要创建索引?
1)在常常须要查询和排序的字段上创建索引
2)数据特别多
什么状况下不要创建索引?
1)字段数据存在大量的重复,如:性别
2)数据不多
3)常常须要增删改的字段
什么状况下索引会失效?
1)模糊查询时,使用like ‘%张%’会失效,而like ‘张%’不会
2)使用is null或is not null查询时
3)使用组合索引时,某个字段为null
4)使用or查询多个条件时
5)在函数中使用字段时,如where year(time) = 2019
不一样的存储引擎使用不一样结构的索引:
聚簇索引,InnoDB支持,索引的顺序和数据的物理顺序一致,相似新华字典中的拼音目录排列和汉字排列顺序一致,聚簇索引一个表中只能有一个。
非聚簇索引,MyISAM支持,索引顺序和数据的物理顺序不一致,相似新华字典中的偏旁部首目录和汉字排列顺序不一致,非聚簇索引表能够有多个。
索引的数据结构主要是:BTree和B+Tree
BTree的数据结构以下,是一种平衡搜索多叉树,每一个节点由key和data组成,key是索引的键,data是键对应的数据,在节点的两边是两个指针,指向另外的索引位置,而全部的键都是排序过的,这样在搜索索引时,可使用二分查找,速度比较快,时间复杂度是h*log(n),h是树的高度,BTree是一种比较高效的搜索结构。
B+Tree的数据结构以下,是BTree的升级版,区别是非叶子节点不在存储具体的数据,只保存索引的键,数据保存到叶子节点中,而且叶子节点中没有指针只有键和数据。B+Tree的优势是:搜索效率更高,由于非叶子节点中没有保存数据,就能够保存更多的键,每一层的键越多,树的高度就会减小,这样查询速度就会提高。
索引是提升查询速度的重要手段,本章咱们学习了索引的分类和建立语法,以及使用索引的策略,不是全部的表都适合建立索引,最后咱们还学习了索引的内部结构,这样你们对索引会有一个基本的认识。