1、前言

MySQL数据库管理系统本身就是一个文件管理系统,虽然它的实现方式确实比较复杂,但本质上是要通过访问磁盘才能完成数据的存储与检索。所以如果我们想要进一步了解MySQL索引的的话,磁盘相关的操作也是需要大致了解一下的。

2、硬盘的读写原理--------------------磁盘的硬件组成--------------------

一般说来,硬盘都是由盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器、接口、缓存等几个部份组成。

--------------------硬盘的基本概念--------------------

-- 2.1 盘片

硬盘由多个盘片组成,盘片一般用铝合金材料做基片,高速硬盘也可能用玻璃做基片,通常有2-3个盘片。

-- 2.2 盘面

每一个盘片都有两个盘面(Side),即上、下盘面,一般每个盘面都会利用,都可以存储数据,成为有效盘片,也有极个别的硬盘盘面数为单数。每一个这样的有效盘面都有一个盘面号,按顺序从上至下从0开始依次编号。在硬盘系统中,盘面号又叫磁头号,因为每一个有效盘面都有一个对应的读写磁头,由于磁盘通常有2-3个盘片,故盘面号为0-3或0-5。

-- 2.3 磁头

每一个有效盘面都有一个对应的读写磁头,作用就是将对盘面进行读写操作。

-- 2.4 磁道

磁盘在格式化时被划分成许多同心圆,这些同心圆轨迹叫做磁道(Track)。磁道从外向内从0开始顺序编号。硬盘的每一个盘面有300-1024个磁道。

-- 2.5 柱面

所有盘面上的同一磁道构成一个圆柱,通常称做柱面(Cylinder),每个圆面上的磁头由上而下从0开始编号。数据的读/写按柱面进行,即磁头读/写数据时首先在同一柱面内从0盘面开始进行操作,依次向下在同一柱面的不同盘面上进行操作,只有当同一柱面上所有的盘面全部读/写完毕后,磁头才转移到下一柱面(同心圆再往里的柱面)。

为什么磁盘的读写操作是按照柱面进行?原因是选取盘面(磁头)只需通过电子切换即可,而选取柱面则必须通过机械切换。又因为电子切换比在机械上磁头向邻近磁道移动快得多,所以磁盘的读写操作是按照柱面进行。也就是说,在进行写操作时,在某个柱面的某个盘面的磁道写满数据后,切换到同一柱面的下一个盘面的磁道上接着写,一个柱面写满后,才移到下一个柱面的0盘面。读数据也按照这种方式进行,这样就提高了硬盘的读/写效率。

-- 2.6 扇区

每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区(Sector),扇区是硬盘的最小读写单元。一个扇区有两个主要部分:存储数据地点的标识符和存储数据的数据段。

标识符:包括组成扇区三维地址的三组数字

柱面号:扇区所在的磁道;

盘面号:扇区所在的盘面;

扇区号:扇区在磁道上的位置。也叫块号;

数据段:512个字节的数据

-- 2.7 盘块

操作系统与磁盘打交道的最小单位是磁盘块。由于扇区的内容比较小,且数目众多,导致操作系统在寻址时比较困难,所以操作系统就将相邻的扇区(2的N次方个扇区)组合在一起,形成一个块,再对块进行整体的操作。

--------------------磁盘的访问流程--------------------

1、获取数据的物理地址:当操作系统需要从磁盘读取数据时,操作系统会将数据的逻辑地址传给磁盘,磁盘的控制电路按照寻址逻辑将逻辑地址翻译成物理地址(柱面号、盘面号、扇区号)。

2、从指定扇区读取数据:在获取了数据的物理地址之后,接下来从扇区上读取的数据。首先磁盘需要找到柱面与盘面,即磁头需要移动对准相应柱面下的磁道,这个过程叫做寻道,所耗费时间叫做寻道时间。然后目标扇区旋转到磁头下,即磁盘旋转将目标扇区旋转到磁头下,这个过程耗费的时间叫做旋转时间。最后将扇区中的数据传输到操作系统的内存中,所耗费时间叫做传输时间。

3、即一次访盘请求(读/写)完成过程由三个动作组成:

寻道延迟(时间):指定磁头移动定位到指定柱面的指定磁道

旋转延迟(时间):等待指定扇区从磁头下旋转经过

数据传输(时间):数据在磁盘与内存之间的实际传输

--------------------磁盘的访问原理--------------------

系统将文件存储到磁盘上时,按柱面、磁头、扇区的方式进行,即最先读/写第0磁道的第0磁头下(也就是第0盘面的第0磁道)的所有扇区。然后是同一柱面的下一磁头,……,一个柱面存储满后就推进到下一个柱面,直到把文件内容全部写入磁盘。

文件的记录在同一盘组上存放时,应先集中放在一个柱面上,然后再顺序存放在相邻的柱面上,对应同一柱面,则应该按盘面的次序顺序存放。即:从上到下,然后从外到内。数据的读/写按柱面进行,而不按盘面进行。

系统也以相同的顺序读出数据。读出数据时通过告诉磁盘控制器要读出扇区所在的柱面号、磁头号和扇区号(物理地址的三个组成部分)进行。磁盘控制器则 直接使磁头部件步进到相应的柱面,选通相应的磁头,等待要求的扇区移动到磁头下。在扇区到来时,磁盘控制器读出每个扇区的头标,把这些头标中的地址信息与期待检出的磁头和柱面号做比较(即寻道),然后,寻找要求的扇区号。待磁盘控制器找到该扇区头标时,根据其任务是写扇区还是读扇区,来决定是转换写电路, 还是读出数据和尾部记录。找到扇区后,磁盘控制器必须在继续寻找下一个扇区之前对该扇区的信息进行后处理。如果是读数据,控制器计算此数据的ECC码,然 后,把ECC码与已记录的ECC码相比较。如果是写数据,控制器计算出此数据的ECC码,与数据一起存储。在控制器对此扇区中的数据进行必要处理期间,磁 盘继续旋转。

--------------------局部性原理与磁盘预读--------------------

由于存储介质的特性,磁盘本身存取就比主存慢很多,再加上机械运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了提高效率,要尽量减少磁盘I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理:

1、当一个数据被用到时,其附近的数据也通常会马上被使用。

2、程序运行期间所需要的数据通常比较集中。

由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率。

预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。

3、索引的基本使用--------------------索引简介--------------------

数据库在保存数据时,除了保存本身之外,还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。简而言之,索引就是帮助MySQl高效获取数据的数据结构。

--------------------索引语法--------------------

----------普通索引的创建语法----------

-- 方式一:直接创建索引

CREATE INDEX index_name ON table_name (column_name);

-- 方式二:修改表结构时添加索引

ALTER TABLE table_name ADD INDEX index_name ON column_name;

-- 方式三:创建表时直接添加索引

CREATE TABLE dept (

dept_id INTEGER PRIMARY KEY AUTO_INCREMENT,

dept_name VARCHAR(32) DEFAULT NULL,

INDEX id_dept_deptname (dept_name)

)

----------主键索引的创建语法----------

-- 数据库会自动为主键字段设置主键索引

CREATE TABLE dept (

dept_id INTEGER PRIMARY KEY AUTO_INCREMENT,

dept_name VARCHAR(32) DEFAULT NULL

)

----------唯一索引的创建语法----------

-- 方式一:直接创建索引

CREATE UNIQUE INDEX index_name ON table_name (column_name);

-- 方式二:修改表结构时添加索引

ALTER TABLE table_name ADD UNIQUE INDEX index_name ON column_name;

-- 方式三:创建表时直接添加索引

-- 单独设置唯一索引

CREATE TABLE dept (

dept_id INTEGER PRIMARY KEY AUTO_INCREMENT,

dept_name VARCHAR(32) DEFAULT NULL,

UNIQUE INDEX id_dept_deptname (dept_name)

)

-- 字段添加唯一约束之后,数据库会自动为存在唯一约束的列设置唯一索引

CREATE TABLE dept (

dept_id INTEGER PRIMARY KEY AUTO_INCREMENT,

dept_name VARCHAR(32) UNIQUE DEFAULT NULL

)

----------组合索引的创建语法----------

-- 创建表时直接添加索引

CREATE TABLE dept (

dept_id INTEGER PRIMARY KEY AUTO_INCREMENT,

dept_name VARCHAR(32) DEFAULT NULL,

manager_id INTEGER,

INDEX idx_deptnameManagerid (dept_name,manager_id)

)

-- 修改表结构时添加索引

ALTER TABLE table_name ADD INDEX index_name (column_name,column_name);

----------索引的查询删除语法----------

-- 查询索引

SHOW INDEX FROM table_name;

-- 删除索引

DROP INDEX index_name ON table_name;

4、为什么选择B+树作为索引

一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

常见的数据结构有:散列表、二叉搜索树、二叉平衡树、红黑树、B树、B+树这些数据结构中,为什么MySQL选择了B+树?数据结构缺点散列表1、存在hash冲突,降低查询效率 2、hash表需要存放在内存中,且占用大量内存(hash表最大为2的32次方) 3、hash表的内容是无序存放的(指的是无法控制存放顺序),导致无法进行范围查询

二叉搜索树当插入的值为递增或递减时,二叉树会退化为链表

二叉平衡树为了提高查询效率二降低了插入效率

红黑树当数据量太大时树的高度太高,导致IO过多

B树每个节点存放的数量太少,导致树的高度会增高

mysql索引 物理文件_MySQL索引详解相关推荐

  1. mysql索引 物理文件_MySQL体系结构之物理文件

    一.MySQL日志文件 mysql日志文件及功能: 日志文件 功能 错误日志 记录启动.停止.运行过程中mysqld时出现的问题 通用日志 记录建立客户端连接和执行的语句 二进制日志 记录更改数据的所 ...

  2. mysql索引 物理文件_MySQL架构和MySQL索引

    1.MySQL架构 1.1逻辑架构图 1.1.1Connection Pool:连接池 *管理缓冲用户连接,线程处理等需要缓存的需求. *负责监听对MySQL Server的各种请求,接收连接请求,转 ...

  3. mysql安装包含哪几种文件_MySQL安装详解

    MySQL安装详解 [下载地址:http://dev.mysql.com/downloads/] 参考文献:http://dev.mysql.com/doc/refman/5.1/zh/install ...

  4. mysql explain ref列_MySQL EXPLAIN详解

    MySQL EXPLAIN详解:http://www.jianshu.com/p/ea3fc71fdc45 MySQL EXPLAIN命令是查询性能优化不可缺少的一部分,该文主要讲解explain命令 ...

  5. mysql 事务 注意 优化_MySQL入门详解——事务、锁、优化

    MySQL事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在一个商城系统中,用户执行购买操作,那么用户订单中应该加一条,库存要减一条,如果这两步由于意外只进行了其中一步那么就会发生 ...

  6. mysql 事务 注意 优化_MySQL入门详解(二)---mysql事务、锁、以及优化

    MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在一个商城系统中,用户执行购买操作,那么用户订单中应该加一条,库存要减一条,如果这两步由于意外只进行了其中一步那么就会发生很大的问题.而事 ...

  7. mysql 客户端连接日志_MySQL 日志详解

    一.MySQL 日志分类 MySQL 日志主要包含:错误日志.查询日志.慢查询日志.事务日志.二进制日志. 错误日志: -log-err (记录启动.运行.停止 MySQL 服务时出现的信息) 查询日 ...

  8. 2005数据库导入mysql没有主键_mysql数据库详解(续二)

    mysql数据库登陆问题解决汇总 首先需要说明一下,MYSQL数据库登陆的方式,通常就是本地登陆(localhost)和远程登陆,那么这里在深入地了解一部localhost和127.0.0.1的区别是 ...

  9. mysql数据类型的验证_MYSQL数据类型详解

    无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构.充分利用空间是十分必要的.这就要求我们对数据库系统的常用数据类型有充分的认识.下面我就将我的一点心得写出来跟大家分享. 一.数字 ...

最新文章

  1. 解决git clone慢问题
  2. 微信 php 接口 函数,PHP的json_encode函数应用到微信接口有关问题(include \uxxxx will create fail)...
  3. 有了它,不会JavaScript,也能写出各种精彩页面!
  4. 超简单的视频对象提取程序
  5. python eval函数_Python eval 函数妙用
  6. 关于C#的sqlite数据库操作类
  7. 使用WMI和性能计数器监控远程服务器权限设置
  8. 【声源定位】基于matlab广义互相关声源定位【含Matlab源码 548期】
  9. 用python画猫咪怎么画-python画猫
  10. linux cd是什么目录,linux cd是什么意思?
  11. HDU 613 Kolakoski
  12. python常用数学公式
  13. JavaCV1.5.3版本FFmpegFrameGrabber初始化的时候加载时间长的解决方法
  14. GitHub 上受欢迎的 Android UI Library整理(part_two)
  15. 双线机房托管双线双IP20M独享带宽4500/年 欢迎咨询Q1763371
  16. 手机号,邮箱正则匹配验证
  17. 【运维】浪潮服务器一块硬盘显示红色Offline(或者Failed)解决办法
  18. 三国杀online网页版服务器更新,2019年《三国杀Online》更迭汇总,一切为了“fun”...
  19. 说说我平时用的几个学习网站(网址)吧,希望可以给你帮助
  20. 科普|汽车毫米波雷达的规定和标准 雷达设备产品 无线电设备技术

热门文章

  1. vue启动报错!Module build failed: Error: Missing binding D:\WorkSpace\vue\OfficeSuite\OfficeFrontend\node
  2. 怎么在exc中用计算机,如何在Excel中使用计数功能
  3. 思维导图——带你快速掌握信号与传输介质
  4. Pix4Dmapper 正射全景生成
  5. css3之制作个性照片墙
  6. 自动化测试面试总结干活-----转载
  7. 分享一个比较完整的Vue2+项目供大家交流学习
  8. 基于GAE的终极网络书签
  9. c语言指针与数组的深入理解
  10. 大数据一些启动脚本和采集脚本