索引特性.

目录

  • 没有索引,可能会有什么问题
  • 认识磁盘
    • MySQL与存储
    • 先来研究一下磁盘
    • 在看看磁盘中一个盘片
    • 扇区
    • 定位扇区
    • 结论
    • 磁盘随机访问(Random Access)与连续访问(Sequential Access)
  • MySQL 与磁盘交互基本单位
  • 建立共识
  • 索引的理解
    • 建立测试表
    • 插入多条记录
    • 查看插入结果
    • 中断一下---为何IO交互要是 Page
    • 理解单个Page
    • 理解多个Page
    • 页目录
    • 单页情况
    • 多页情况
    • 复盘一下
    • InnoDB 在建立索引结构来管理数据的时候,其他数据结构为何不行?
    • B+ vs B
    • 聚簇索引 VS 非聚簇索引
  • 索引操作
    • 创建主键索引
    • 唯一索引的创建
    • 普通索引的创建
    • 全文索引的创建
    • 查询索引
    • 删除索引
    • 索引创建原则
    • 其他概念

没有索引,可能会有什么问题

索引特性._第1张图片

  • 先整一个海量表,在查询的时候,看看没有索引时有什么问题?
--构建一个8000000条记录的数据
--构建的海量表数据需要有差异性,所以使用存储过程来创建, 拷贝下面代码就可以了,暂时不用理解

-- 产生随机字符串
delimiter $$
create function rand_string(n INT)
returns varchar(255)
begin
declare chars_str varchar(100) default
'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';
declare return_str varchar(255) default '';
declare i int default 0;
while i < n do
set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));
set i = i + 1;
end while;
return return_str;
end $$
delimiter ;

--产生随机数字
delimiter $$
create function rand_num()
returns int(5)
begin
declare i int default 0;
set i = floor(10+rand()*500);
return i;
end $$
delimiter ;

--创建存储过程,向雇员表添加海量数据
delimiter $$
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0;
set autocommit = 0;
repeat
set i = i + 1;
insert into EMP values ((start+i)
,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
until i = max_num
end repeat;
commit;
end $$
delimiter ;

-- 执行存储过程,添加8000000条记录
call insert_emp(100001, 8000000);

索引特性._第2张图片

认识磁盘

MySQL与存储

MySQL 给用户提供存储服务,而存储的都是数据,数据在磁盘这个外设当中。磁盘是计算机中的一个机
械设备,相比于计算机其他电子元件,磁盘效率是比较低的,在加上IO本身的特征,可以知道,如何提
交效率,是 MySQL 的一个重要话题。

先来研究一下磁盘

索引特性._第3张图片

在看看磁盘中一个盘片

索引特性._第4张图片
索引特性._第5张图片

扇区

索引特性._第6张图片
索引特性._第7张图片

定位扇区

结论

索引特性._第8张图片

磁盘随机访问(Random Access)与连续访问(Sequential Access)

索引特性._第9张图片

MySQL 与磁盘交互基本单位

索引特性._第10张图片

建立共识

索引特性._第11张图片

索引的理解

建立测试表

索引特性._第12张图片

插入多条记录

索引特性._第13张图片

查看插入结果

索引特性._第14张图片

中断一下—为何IO交互要是 Page

索引特性._第15张图片

理解单个Page

在这里插入图片描述
索引特性._第16张图片
索引特性._第17张图片

理解多个Page

索引特性._第18张图片
索引特性._第19张图片

页目录

索引特性._第20张图片

单页情况

索引特性._第21张图片

多页情况

索引特性._第22张图片

复盘一下

在这里插入图片描述

InnoDB 在建立索引结构来管理数据的时候,其他数据结构为何不行?

索引特性._第23张图片
索引特性._第24张图片
在这里插入图片描述
数据结构演示链接:添加链接描述

B+ vs B

B树:
索引特性._第25张图片
B+树:
索引特性._第26张图片
索引特性._第27张图片

聚簇索引 VS 非聚簇索引

MyISAM 存储引擎-主键索引
MyISAM 引擎同样使用B+树作为索引结果,叶节点的data域存放的是数据记录的地址。下图为 MyISAM
表的主索引, Col1 为主键。

索引特性._第28张图片
其中, MyISAM 最大的特点是,将索引Page和数据Page分离,也就是叶子节点没有数据,只有对应数据的地址。
相较于 InnoDB 索引, InnoDB 是将索引和数据放在一起的。
索引特性._第29张图片
其中, InnoDB 这种用户数据与索引数据在一起索引方案,叫做聚簇索引

当然, MySQL 除了默认会建立主键索引外,我们用户也有可能建立按照其他列信息建立的索引,一般这种索引可以叫做辅助(普通)索引。

对于 MyISAM ,建立辅助(普通)索引和主键索引没有差别,无非就是主键不能重复,而非主键可重复。

下图就是基于 MyISAM 的 Col2 建立的索引,和主键索引没有差别
索引特性._第30张图片
同样, InnoDB 除了主键索引,用户也会建立辅助(普通)索引,我们以上表中的 Col3 建立对应的辅助索引如下图:
索引特性._第31张图片
可以看到, InnoDB 的非主键索引中叶子节点并没有数据,而只有对应记录的key值。
所以通过辅助(普通)索引,找到目标记录,需要两遍索引:首先检索辅助索引获得主键,然后用主键
到主索引中检索获得记录。这种过程,就叫做回表查询
为何 InnoDB 针对这种辅助(普通)索引的场景,不给叶子节点也附上数据呢?原因就是太浪费空间
了。
总结:

  • 如何理解硬盘
  • 如何理解柱面,磁道,扇区,磁头
  • InnoDB 主键索引和普通索引
  • MyISAM 主键索引和普通索引
  • 其他数据结构为何不能作为索引结构,尤其是B+和B
  • 聚簇索引 VS 非聚簇索引

索引操作

创建主键索引

索引特性._第32张图片

唯一索引的创建

索引特性._第33张图片

普通索引的创建

索引特性._第34张图片

全文索引的创建

索引特性._第35张图片
索引特性._第36张图片

查询索引

索引特性._第37张图片

删除索引

索引特性._第38张图片

索引创建原则

索引特性._第39张图片

其他概念

在这里插入图片描述

你可能感兴趣的:(MySQL,mysql,数据库,sql)