小白学 SQL 第十一天:索引和视图

已经介绍了 SQL 的查询、定义、插入、修改、删除等操作,接下来将介绍数据库另一个重要的知识点:索引,特别是在查询优化的时候,索引将是优化的最重要手段之一。查询本身会随着我们的应用功能的增强,不断的增加复杂度,这时就需要管理复杂查询的手段:视图。

知识要点

索引

MySQL 索引操作语句

BTREE 和 HASH

视图

这里的内容可能有点难,有一定使用经验可能会更容易理解。不过没有关系只要知道索引的基本概念和操作语句就行,大家真的在使用到时再来看或查询相关资料就可以了。

现代数据库无一不包含索引。首先我们需要理解为什么?就像之前说的,数据库是用来做大量数据管理和查询的系统。在现在这个以数据为中心的时代,任意一个业务系统数据量也是动辄百万了,大部分业务系统都在千万到亿这个级别,现在大家平时接触到的系统在亿这个级别的很多。这么大的数据量存储在磁盘中,怎么能快速的获取我们所需要的数据?总不能每次都取出全部数据吧!(当然这里数据的高效存储也非常重要,不过这个已经超出了这里范围了不做介绍)

索引

数据库中的所有数据都会持久化的磁盘中,磁盘读取速度是很慢的,并且数据库里的数据都会比较大,如果我们每次查询都从磁盘里面读入所有数据进行比较过滤,那将会是非常慢的。所以数据库为了更快的检索需要的数据,就需要使用一种高效的数据结构来组织编目原始数据,这就是这里介绍的:索引。

大家不要以为索引数据会很小,其实索引也是很大的。如果索引长度是 16字节,表数据量是 1亿,那表的这个索引存储需要的空间至少是15G(因为在存储的时候还需要存储索引结构的其他信息)。计算机的内存资源是很昂贵的,且索引数据也需要永久存储,所以索引结构数据也是存储在磁盘里面。数据库在读取数据时是按照每页读取的,数据库会以页为单位缓存已经读取的索引数据。关于如何估算页数量不在本文内容中,但是这个对于理解如何优化 SQL 会很重要,感兴趣的可以查询相关资料。

MySQL 索引语法

MySQL 里面索引管理使用 alter 语句,对于创建索引还可以使用 create index 语句。

Create Index

create index 语句只是 alter table 语句的另一种语法, 可以完全映射到 alter table 创建索引语句中。并且 create index 不能用于主键的创建,主键的创建需要使用 alter 语句或在 create table 表结构创建语句中。

Alter 语句

使用ALTER 语句添加索引

使用 ALTER 语句添加主键

删除索引

删除主键

你可以使用 SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息。

这里这里我把主键和外键也看做是索引,他们只是索引的 2 中特殊类型

索引分类:普通索引(默认)、唯一索引(unique)、全文索引(fulltext)、空间索引(spatial)、主键、外键

普通索引和唯一索引的数据结构类型可以有:BTree 和 Hash

空间索引使用 R-Tree,也叫 R-Tree 索引

主键一个表只能有一个,可以包含多个列,且列的数据(如果是多列,就是组合数据)必须唯一,且列值不能为 NULL

当遇到比较大的字符串字段,可以仅仅使用字段前面部分数据创建索引

索引类型

这里面主键、外键、普通索引、唯一索引比较常见,全文索引和空间索引在一些特定的业务场景里面会使用到。

针对普通索引和唯一索引,底层的存储的数据类型可以有2个选择:一个是 B Tree,一个是 Hash。由于底层的数据结构不同,所以两种类型支持的操作也有所区别。并且不同的存储引擎对索引类型的支持也是不同的。全文索引的数据结构类型的实现依赖于存储引擎,空间索引使用 R-Tree 实现。

不同存储引擎对于索引类型支持的特性也是不同的。

InnoDB 存储引擎支持特性

MyISAM 存储引擎支持特性

MEMORY 存储引擎支持特性

NDB 存储引擎支持特性

注意

如果使用 ,则可以防止创建隐式有序索引。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180607G09IVT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券