索引

1, 介绍&了解

1.1 数据库的内部结构

在谈到索引之前, 我们首先要搞明白什么是MySQL的数据库引擎.

而我们要研究数据库引擎, 我们更要先知道MySQL数据库系统的内部构成.

从上图我们可以知道,MySQL的体系架构划分为四层。分别为:网络接入层服务层存储引擎层文件系统层

连接器:提供了应用程序接入MySQL服务器的接口,其功能包管理连接,身份验证,权限的验证等。

分析器:首先MySQL需要知道你想做什么。因此需要对输入的SQL进行解析。首先进行词法分析,需要识别出里面的字符串代表什么意思。比如 (select id from t), SELECT 代表查询,T 代表某张表,ID 代表某张表的列字段叫id;之后进行语法分析,根据语法规则,判断输入的 sql 语句是否符合MySQL语法。

优化器:经过解析之后,MySQL就知道你需要做什么事情了。但是在真正执行之前还需要经过优化器处理。比如当表中存在多个索引的时候,选择哪个索引来使用。或者多表关联的时候,选择各个表的连接先后顺序。

存储引擎:是数据库真正做数据存取操作的实现部分,在MySQL中有多种存储引擎共同组成,每个存储引擎都有自己的特点,MySQL服务器是通过调用存储引擎提供的函数接口来与存储引擎交互。而这些函数接口包含了很多底层的操作,比如开始一个事务,或者取出有特定主键的行。该接口隐藏了各个存储引擎不同的地方,对于服务层级是透明的。存储引擎不能解析SQL语句,互相之间也不能通信,仅仅是简单的响应服务器的请求

了解了MySQL的结构之后,那我们就可以知道,数据的存储和存储引擎息息相关。不同的存储引擎存储数据的方式是不一样的。

在MySQL中,有很多种存储引擎, 主要要了解的是MyISAM和InnoDB

  • InnoDB(5.1之后默认的存储引擎),这个存储引擎其实一开始是以插件的形式存在的,在5.1之后,MySQL官方团队把InnoDB当成了默认的存储引擎

  • MyISAM(5.1之前默认的存储引擎),这个存储引擎是由MySQL的官方团队开发的

1.2 数据库的一些问题

MySQL数据库服务器, 是由数据管理系统和数据两部分构成, 而这个管理系统的设计是一种单进程多线程架构.

mysql的安装目录

在/user/下mysql的安装信息存在不同路径中:

功能位置其它
mysql客户端程序目录/usr/bin/ 
mysqld服务器程序目录/usr/sbin/ 
mysql客户端头文件目录/usr/include/mysql/ 
mysql客户端库文件目录/usr/lib/mysql/ 
man帮助手册页目录/usr/share/man/ 
字符集、语言相关的错误信息目录/usr/share/mysql/ 

mysql的数据文件目录: 有必要了解一下

在数据目录中的一些文件的作用: (仅了解)

配置文件

  • 当MySQL实例和各种工具程序启动时,需要通过配置文件读取各种参数用以启动程序。

日志文件: (了解)

一些查看命令:

 

2, 索引

2.1 什么是索引

MySQL官方对索引的定义是:索引是可以帮助MySQL高效获取数据的数据结构。即索引是按照某些数据结构组织数据库数据的一种方式。数据库在执行查询的时候,如何没有索引存在的情况下,会采用全表扫描的方式进行查找。如果存在索引,则会先去索引列表中定位到特定的行或者直接定位到数据,从而可以极大地减少查询的行数,增加查询速度。

我们可以把索引类比为一部字典开头的目录。

2.1.1 数据结构和索引

在计算机组织数据的过程中, 常见的数据结构有:

那么上述那种数据结构比较符合我们实际组织数据的需求?

2.1.1.1 数据结构的简介

二叉搜索树OR红黑树

红黑树特点

二叉搜索树OR红黑树作为索引有什么缺点?

B树

对于一颗m阶的B树而言

B树相对于平衡二叉树或者红黑树,最大的优势在什么地方?

B树作为索引有什么缺点?

B+树

B+树它可以看成是 B 树的变种。具有以下特点:

特点:B+树由于非叶子节点不存储数据,仅在叶子节点才存储数据,所以,单个非叶子节点可以存储更多的索引字段

Hash表

Hash表也叫散列表,根据相关的Key而直接访问的数据结构。通过Key计算一个固定的运算转换成一个数字,然后将这个数字对数组的长度取余,最终的结果就当做数组的下标。对应的数据就放在该下标处。

如果采用Hash表作为索引,其查询效率也是很高的(可选的)。但是Hash表会普遍用于MySQL的索引上来吗?

2.2 存储引擎在索引上的重要区别

2.2.1 MyISAM

数据基础

使用MyISAM存储引擎存储的表和表中数据的文件由三个文件组成: (/var/lib/mysql/)

主键索引

所谓主键索引, 就是把主键作为索引

在MyISAM中, 通过主键索引访问的叶子上存储结果,不是一条一条数据, 而是数据的物理地址

非主键的普通索引

所谓非主键索引, 就是把非主键设置为索引

在MyISAM中, 通过非主键索引访问的叶子上存储结果,不是一条一条数据, 和其主键索引一样也是数据的物理地址

2.2.2 InnoDB

数据基础

使用InnoDB存储引擎存储的表的文件由两个个文件组成:

主键索引

所谓主键索引, 就是把主键作为索引

在InnoDB中的主键索引 是和MyISAM中的主键索引不同的

在InnoDB中 通过主键索引访问的最终的叶子上的结果, 是数据本身

非主键的普通索引

所谓非主键索引, 就是把非主键字段设置为索引

在InnoDB中, 通过非主键索引访问的叶子上存储的结果, 是主键索引的值

2.3 索引语法: 作为了解

不用记

索引的操作语法

我们给一个列声明为主键,默认主键这一列就会是主键索引

3, 索引延伸问题

面试问题: 重要

1, 什么是聚集索引/聚簇索引, 什么是非聚集索引/非聚簇索引?

2, Innodb表中不建立索引/没有主动设置主键, 为什么要有默认索引? 默认索引是什么?

3, 索引性能这么好,是不是一个表建立的索引越多越好?

4, 什么列适合作为索引?

5, 磁盘IO思考: 补充(6字节指针4字节主键, 16k/10字节 = 16*1024/10 = 1638 --> 树层高) : 了解

MySQL 每次从外存加载数据, 每次加载16kb.

id -> int , 4个字节

地址 -> 6字节

10个字节 --> 1638个数据 --> 1639区间

B+树: 2层(都是地址和索引). 1639 * 1638 = 268万数据

6, 索引一般在建表的时候创建,一般会设为int而且是auto_increment

7, 什么是回表? 如何避免回表? 什么是覆盖索引?

8, MyISAM和InnoDB的区别 (以及memory存储引擎)

9, 什么情况下选择使用MyISAM?

MyISAM的问题在于它在做添加/删除/修改时锁定了表(而且会在读取的时候阻塞写入, 只有读不阻塞读),而InnoDB在做添加/删除/修改时只是锁定了行。

什么情况下使用memory存储引擎?

10, 最左匹配原则

一个索引, 是有可能通过多个列组合而成的, 先以最左侧的列作为比较的依据, 如果一样, 再比较下一个字段

11, 全文索引