广州住房和城乡建设部网站首页,wordpress和dede seo,大连开发区网络公司,如何重装电脑的wordpress为什么要有索引
索引可以提高数据库的性能。不用加内存#xff0c;不用改程序#xff0c;不用调sql#xff0c;只要执行正确的create indix#xff0c;查询的速度就可能提高成百上千倍。但相应的代价是#xff0c;插入#xff0c;更新#xff0c;删除的速度有所减弱。 …为什么要有索引
索引可以提高数据库的性能。不用加内存不用改程序不用调sql只要执行正确的create indix查询的速度就可能提高成百上千倍。但相应的代价是插入更新删除的速度有所减弱。 所以索引的作用在于提高一个海量数据的检索速度
常见索引分为
主键索引(primary key)唯一键索引(unique)普通索引(indix)全文索引(fulltext) - 解决子文索引问题
认识磁盘
我们知道了索引的作用是提高数据检索的速度那么海量数据的检索为什么慢呢我们需要通过认识数据的存储来了解
MySQL与存储
MySQL给用户提供存储服务而存储的都是数据数据在磁盘这个外设当中。磁盘是计算机中的一个机械设备相比于其他电子元件磁盘的效率是比较低的在加上IO本身的特征所以存取数据是一个比较慢的操作 磁盘的物理结构和数据存取可以参看磁盘文件系统的第一部分
总结来说 数据的存取在磁盘中需要经历以下步骤 定位读取的盘面进而确定哪一个磁头读取数据定位读取哪一个磁道定位读取哪一个扇区 整个过程称为CHS定位法 磁头head 磁道(柱面)cylinder扇区sector 这些步骤都是机械运动所以速度相比于电子元件会慢上很多 另外 数据在扇区里大多是以512字节存储 操作系统读取数据的单位是数据块(4kb)也就是8个扇区 数据库文件本质就是保存在磁盘的盘片当中当数据库文件很大时一定需要占据多个扇区 磁盘随机访问与连续访问
随机访问本次IO所给出的扇区地址和上次IO给出的扇区地址不连续此时磁头在两次IO操作之间需要作较大移动才能重新开始读/写数据连续访问如果本次IO给出的扇区地址与上次IO结束的扇区地址是连续的那么磁头就能很快的开始这次IO操作这样的多个IO操作称为连续访问
如果相邻的两次IO操作是在同一时刻发出的但它们请求的扇区地址相差很大的话也只能称为随机访问而非连续访问
磁盘是通过机械运动进行寻址的连续访问不需要过多的定位故效率比较高
MySQL与磁盘交互的基本单位
MySQL是一款应用软件其与磁盘的交互需要依靠操作系统从中构建桥梁我们可以将其想象为一种特殊的文件系统它有着更高的IO场景。 所以为了提高基本的IO效率MySQL进行IO的基本单位是16KB(InnoDB存储引擎)
mysql show global status like innodb_page_size;
-------------------------
| Variable_name | Value |
-------------------------
| Innodb_page_size | 16384 | -- 16*1024
-------------------------也就是磁盘的基本单位是扇区512字节操作系统基本单位是数据块4KBMySQL基本单位是page(页)16KB 三者数据交互如下 MySQL中的数据文件是以page为单位保存在磁盘当中的MySQL的CURD操作(create update read delete)都是需要计算找到相应的插入位置或者找到对应要修改或者查询的数据涉及计算就需要CPU参与而为了便于CPU参与一定要能够先将数据移动到内存当中所以在特定时间内数据一定是在磁盘和内存中都存在的。后续完成内存数据的操作后以特定的舒心策略刷新到磁盘。此时会涉及磁盘和内存的数据交互也就是IO。而此时IO的基本单位是page为了更好的进行上述操作MySQL服务器在内存运行时在服务器内部会申请被称为buffer bool的内存空间来进行各种缓存。使用这个内存空间和磁盘数据进行IO交互所以为提高效率一定要尽可能的减少系统和磁盘的IO次数 局部性原理
局部性原理分为时间局部性和空间局部性
局部性原理出现的原因大部分人认为是程序的指令大部分时间是顺序执行而且程序的集合如数组等各种数据结构都是连续存放的
时间局部性如果程序中的某条指令一旦执行则不久之后该指令可能再次被执行如果某数据被访问则不久之后该数据可能再次被访问空间局部性一旦程序访问了某个存储单元则不久之后其附近的存储单元也很大可能被访问
参考局部性原理 MySQL的IO交互为什么要用page
为什么MySQL和磁盘进行IO交互要使用page呢而不是用多少加载多少呢
倘若我们有十个数据其中id从1到10如果用多少加载多少每次都只加载一个数据查找id10就需要十次IO
但如果使用page存储那么十个数据都是存储在一个page中一次IO读取整个page放入buffer bool。无论是id3,4,8都是在内存中查找。大大减少了IO的次数
但是我们无法保证用户下次查找的数据一定在这个page中但是因为局部性原理大概率在这个page中 往往IO效率低下的最主要矛盾不是IO单次数据量的大小而是IO的次数