MySQL数据库 详谈索引(一)

MySQL数据库索引优化 MySQL数据库索引优化,介绍了索引的重要性、什么是索引、如何使用索引、索引的优化以及示例分析 阅读详情

目录

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

2. 认识磁盘

3. MySQL 与磁盘交互基本单位


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

索引:提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的 create index ,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。

常见索引分为:

主键索引(primary key)

唯一索引(unique)

普通索引(index)

全文索引(fulltext)--解决中子文索引问题。

案例:

先整一个海量表,在查询的时候,看看没有索引时有什么问题?

--构建一个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);

到此,已经创建出了海量数据的表了。

查询员工编号为998877的员工

select * from EMP where empno=998877;

可以看到耗时4.93秒,这还是在本机一个人来操作,在实际项目中,如果放在公网中,假如同时有

1000个人并发查询,那很可能就死机。

解决方法,创建索引

alter table EMP add index(empno);

换一个员工编号,测试看看查询时间

select * from EMP where empno=123456;

2. 认识磁盘

MySQL与存储

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

先来研究一下磁盘:

在看看磁盘中一个盘片

扇区

数据库文件,本质其实就是保存在磁盘的盘片当中。也就是上面的一个个小格子中,就是我们经常所说的扇区。当然,数据库文件很大,也很多,一定需要占据多个扇区。

题外话:

从上图可以看出来,在半径方向上,距离圆心越近,扇区越小,距离圆心越远,扇区越大

那么,所有扇区都是默认512字节吗?目前是的,我们也这样认为。因为保证一个扇区多大,是由比特位密度决定的。

不过最新的磁盘技术,已经慢慢的让扇区大小不同了,不过我们现在暂时不考虑。

我们在使用Linux,所看到的大部分目录或者文件,其实就是保存在硬盘当中的。(当然,有一些内存文件系统,如: proc , sys 之类,我们不考虑)

#数据库文件,本质其实就是保存在磁盘的盘片当中,就是一个一个的文件
[root@VM-0-3-centos ~]# ls /var/lib/mysql -l #我们目前MySQL中的文件
total 319592
drwxr-x--- 2 mysql mysql 4096 Apr 15 21:46 57test
-rw-r----- 1 mysql mysql 56 Apr 12 15:27 auto.cnf
drwxr-x--- 2 mysql mysql 4096 May 17 13:52 bit_index
-rw------- 1 mysql mysql 1676 Apr 12 15:27 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Apr 12 15:27 ca.pem
drwx------ 2 mysql mysql 4096 Apr 13 21:26 ccdata_pro
-rw-r--r-- 1 mysql mysql 1112 Apr 12 15:27 client-cert.pem
-rw------- 1 mysql mysql 1680 Apr 12 15:27 client-key.pem
-rw-r----- 1 mysql mysql 16958 Jun 8 15:46 ib_buffer_pool
-rw-r----- 1 mysql mysql 213909504 Jun 8 16:02 ibdata1
-rw-r----- 1 mysql mysql 50331648 Jun 8 16:02 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Jun 8 16:02 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Jun 8 15:46 ibtmp1
drwxr-x--- 2 mysql mysql 4096 Apr 28 14:11 musicserver
drwxr-x--- 2 mysql mysql 4096 May 9 09:47 mysql
srwxrwxrwx 1 mysql mysql 0 Jun 8 15:46 mysql.sock
-rw------- 1 mysql mysql 5 Jun 8 15:46 mysql.sock.lock
drwxr-x--- 2 mysql mysql 4096 Apr 12 15:27 performance_schema
-rw------- 1 mysql mysql 1676 Apr 12 15:27 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Apr 12 15:27 public_key.pem
drwxr-x--- 2 mysql mysql 4096 May 9 09:46 scott
-rw-r--r-- 1 mysql mysql 1112 Apr 12 15:27 server-cert.pem
-rw------- 1 mysql mysql 1676 Apr 12 15:27 server-key.pem
drwxr-x--- 2 mysql mysql 12288 Apr 12 15:27 sys
drwxr-x--- 2 mysql mysql 4096 Jun 5 17:13 test # 自己定义的数据库,里面有数据表

所以,最基本的,找到一个文件的全部,本质,就是在磁盘找到所有保存文件的扇区。

而我们能够定位任何一个扇区,那么便能找到所有扇区,因为查找方式是一样的。

定位扇区

柱面(磁道): 多盘磁盘,每盘都是双面,大小完全相等。那么同半径的磁道,整体上便构成了一个柱面

每个盘面都有一个磁头,那么磁头和盘面的对应关系便是1对1的

所以,我们只需要知道,磁头(Heads)、柱面(Cylinder)(等价于磁道)、扇区(Sector)对应的编号。即可在磁盘上定位所要访问的扇区。这种磁盘数据定位方式叫做 CHS 。不过实际系统软件使用的并不是 CHS (但是硬件是),而是 LBA ,一种线性地址,可以想象成虚拟地址与物理地址。系统将 LBA 地址最后会转化成为 CHS ,交给磁盘去进行数据读取。不过,我们现在不关心转化细节,知道这个东西,让我们逻辑自洽起来即可。

结论

我们现在已经能够在硬件层面定位,任何一个基本数据块了(扇区)。那么在系统软件上,就直接按照扇区

(512字节,部分4096字节),进行IO交互吗?不是

如果操作系统直接使用硬件提供的数据大小进行交互,那么系统的IO代码,就和硬件强相关,换言之,如果硬件发生变化,系统必须跟着变化从目前来看,单次IO 512字节,还是太小了。IO单位小,意味着读取同样的数据内容,需要进行多次磁盘访问,会带来效率的降低。

之前学习文件系统,就是在磁盘的基本结构下建立的,文件系统读取基本单位,就不是扇区,而是数据块。故,系统读取磁盘,是以块为单位的,基本单位是 4KB 。

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

随机访问:本次IO所给出的扇区地址和上次IO给出扇区地址不连续,这样的话磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读/写数据。

连续访问:如果当次IO给出的扇区地址与上次IO结束的扇区地址是连续的,那磁头就能很快的开始这次IO操作,这样的多个IO操作称为连续访问。

因此尽管相邻的两次IO操作在同一时刻发出,但如果它们的请求的扇区地址相差很大的话也只能称为随机访问,而非连续访问。

磁盘是通过机械运动进行寻址的,随机访问不需要过多的定位,故效率比较高。

3. 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=16384
+------------------+-------+
1 row in set (0.01 sec)

也就是说,磁盘这个硬件设备的基本单位是 512 字节,而 MySQL InnoDB引擎 使用 16KB 进行IO交互。即, MySQL 和磁盘进行数据交互的基本单位是 16KB 。这个基本数据单元,在 MySQL 这里叫做page(注意和系统的page区分)

深入理解MySQL数据库索引 MySQL的索引是一种数据结构它可以帮助数据库高效地查询、更新数据表中的数据。索引通过一定的规则排列数据表中的记录,使得对表的查询可以通过对索引的搜索来加快速度。MySQL索引类似于书籍的目录,通过指向数据行的位置,**可以快速定位和访问表中的数据。**就像使用汉语字典的目录(索引)页,可以通过笔画、偏旁部首、拼音等排序的目录快速查到所需要的字。索引应该创建在高频查询的列上。索引需要占用额外的存储空间 – 每一个索引都会生成对应的一个索引树。 阅读详情

相关推荐

MySQL示例数据库sakila-db的安装导入

MySQL示例数据库sakila-db的安装导入 sakila库是一个MySQL官方提供的模拟电影出租厅信息管理系统的数据库,类似于Oracle的scott库,sakila库的下载地址为:h...

coco3600的博客 1444

[MYSQL数据库]- 索引

索引由来,索引是怎么实现的,索引的创建,删除和信息的查询

分享技术 2244

【MySql系列】深入解析数据库索引

在数据库中,索引是一种数据结构,用于快速查找表中的数据。索引包含表中一列或多列的值,这些值按照一定的顺序进行排序,以便优化数据的检索速度。通过使用索引,数据库可以避免全表扫描,从而提高查询性能。

颜淡慕潇 5万+

MySQL索引优化系列:(一)索引的类型

MySQL 是最流行的关系型数据库管理系统,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS

菜菜bu菜的博客 1638

MySQL与Navicat数据仓库搭建实战项目

数据仓库(Data Warehouse)是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,主要用于支持管理决策。与传统的操作型数据库不同,数据仓库强调数据的整合、历史存储和分析能力。它从多个异构数据源中抽取数据,经过清洗、转换、加载(ETL)后,形成统一的结构化数据模型,如星型模型或雪花模型,便于后续的多维分析。Navicat 提供了丰富的功能模块,帮助用户高效地进行数据库开发与管理。

weixin_33375360的博客 1315

ResNet理论基础与具体实现(详细教程)

论文地址:Deep Residual Learning for Image Recognition ​ Identity Mappings in Deep Residual Networks pytroch源码地址:resnet 0x00 前言 ResNet是2015年就提出的网络结构,中文名字叫作深度残差网络,主要作用是图像分类。现在在图像分割、目标检测等领域都有很...

coordinate的博客 8329

MySQL数据库的常用索引

本文关键字:数据库、MySQL、索引的作用、常用索引。在使用数据库的过程中,经常会进行数据的查询。随着数据量的增大,查询的时间会变的原来越长,这就需要合理的建立索引来提高查询效率。

微光点亮星辰 9965

onnxruntime-gpu版本选择与CUDA环境配置实战指南

本文是onnxruntime-gpu版本选择与CUDA环境配置的实战指南。针对AI模型部署中常见的GPU无法调用问题,核心在于确保onnxruntime-gpu版本与系统CUDA Toolkit版本严格匹配。文章详细讲解了如何精准确定CUDA版本、查找官方对应关系、执行正确安装命令,并通过完整测试脚本验证GPU是否成功启用,最后提供了常见问题排查与生产环境调优建议。

weixin_29164091的博客 522

MySQL数据库 详谈索引(二)

MySQL索引原理与操作摘要 本文深入探讨了MySQL索引的工作原理和实际操作。首先解释了MySQL数据存储的基本单位Page(16KB)及其与内存Buffer Pool的交互机制,强调了减少磁盘IO次数的重要性。通过示例演示了主键索引如何自动排序数据,并分析了B+树作为索引结构的优势:多阶特性降低树高、非叶子节点只存键值、叶子节点相连便于范围查询。 对比了InnoDB的聚簇索引(数据与索引共存)和MyISAM的非聚簇索引(数据与索引分离),解释了回表查询的原理。详细介绍了各类索引的创建方式(主键、唯一、普

yuzhaokangcode的博客 1106

差分隐私(Differential Privacy)

差分隐私,拉普拉斯机制和高斯机制的证明

Michale_L的博客 1万+

Axure原型模板与元件库APP交互设计素材(附资料)

在Axure中,手机模型是展示APP或小程序界面效果的重要工具。通过导入手机模型元件,设计师可以更加直观地模拟真实设备的显示效果,从而更准确地评估设计的可行性和用户体验。Axure官方及第三方资源库中提供了多种品牌和型号的手机模型,如iPhone、Android等,设计师可以根据项目需求选择合适的模型进行使用。Axure作为一款强大的原型设计工具,为APP和小程序的设计与开发提供了丰富的界面组件元件库和交互设计素材。

招风的黑耳优快云 1978

MySQL数据库之索引

因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。需要满足最左原则,因为select 语句的where条件是依次从左往右执行的,所以在使用select 语句查询时where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。唯一索引:与普通索引类似,但区别是唯一索引列的每个值都唯一。组合索引(单列索引与多列索引):可以是单列上创建的索引,也可以是在多列上创建的索引。创建唯一键或者创建唯一索引都可实现。

GaLiCHaoFan1的博客 5196

光伏系统选型指南:5种主流MPPT算法优缺点对比(附选型流程图)

本文深入剖析了光伏系统中五种主流MPPT算法的核心原理与性能差异。通过对比扰动观察法、电导增量法、恒定电压法、模糊逻辑控制及人工智能算法在追踪精度、响应速度、实现成本与稳定性等方面的表现,为不同应用场景(如户用、工商业及大型电站)提供了清晰的选型决策流程图和实战指南,帮助工程师优化系统效率与投资回报。

weixin_29294597的博客 106

MYSQL之索引详谈(三种介绍方式)

概述 用来加快查询的技术很多,其中最重要的是索引。通常索引能够快速提高查询速度。如果不适用索引,MYSQL必须从第一条记录开始然后读完整个表直到找出相关的行。表越大,花费的时间越多。但也不全是这样。本文讨论索引是什么以及如何使用索引来改善性能,以及索引可能降低性能的情况。 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以...

Again yy 1347

HFSS的边界条件与激励方式

在电磁场理论学习中我们知道,电磁场问题的求解都归结于麦克斯韦(Maxwell)方程组的求解,在HFSS中波动方程的求解同样是由微分形式的麦克斯韦方程推导出来的。而边界条件定义了求解区域的边界以及不同物体交界处的电磁场特性,是求解麦克斯韦方程的基础。 只有在假定场矢量是单值、有界、并且沿空间连续分布的前提下,微分形式的麦克斯韦方程组才是有效的;而在求解区域的边界,不同介质的交界处和场源处,场矢量是不连续的,那么场的导数也就失去了意义。 边界条件就是定义跨越不连续边界处的电磁场特性,因此,正确地理解、定义并

ASH_GUARDIAN的博客 1万+

医疗器械软件测试输出内容(1)

*单元测试(Unit Testing):**单元测试是软件测试的最底层,用于验证软件中最小的可测试单元——函数、方法或模块。系统测试是在集成测试之后进行的,它对整个系统进行测试,验证系统在不同部分集成在一起后是否满足需求和规格。: 集成测试是在单元测试之后进行的,它关注不同单元之间的交互和集成。对于不同安全级别的软件(IEC 62304 A类、B类、C类),在体系上要求输出的文件内容有所区别。**说明:**将集成测试和软件系统测试合并为一项单一的计划和一组活动是可接收的。

ct745363083的博客 1867

MySql数据库索引介绍

写在前面 数据库索引对我们来说是透明的,因为数据库表创建索引前后,SQL语句都可以正常运行,索引的运用只是数据库引擎工作时候的优化手段。但是,这并不是说数据库索引仅仅是数据库设计开发人员和运维人员的事情,对于一个测试人员,如果对数据库中已有的索引有所了解,可以对测试过程中发现的涉及数据库操作的问题进行深入分析,知其所以然。 什么是索引 索引是一种特殊的文件(MySql...

javaboy 8201

阿里云人工智能工程师ACA认证免费课程学习笔记

阿里云人工智能工程师ACA认证免费课程学习笔记

engchina的专栏 2013

MySQL数据库索引

索引是帮助MySQL 高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引向(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

new9232的博客 2047

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MySQL 数据库如何创建索引、索引的语法格式是什么

在数据库中,索引可以提高数据的检索速度;MySQL 数据库提供了三种创建索引的方法:一、使用 CREATE INDEX 语句可以使用专门用于创建索引的 CREATE INDEX 语句在一个已有的表上创建索引,但该语句不能创建主键。1.语法格式:CREATE ON ( [] [ ASC | DESC])2.语法说明如下::指定索引名。一个表可以创建多个索引,但每个索引在该表中的名称是唯一的。:指定要创建索引的表名。

momovi的博客 3046

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【MySQL 一 数据库基础】深入解析 MySQL 的索引页结构原理及索引分类

1. MySQL中的页 1.1 为什么要使用页? 1.2 查看页的大小的语法 1.3 数据页 1.3.1 概念 1.3.2 结构 2 B+在MySQL索引中的应用 3 计算三层树高的B+树,理论上可以存放多少条记录 4 索引分类 4.1 主键索引 4.2 普通索引 4.3 唯一索引 4.4 全文索引 4.5 聚集索引 4.6 非聚集索引/二级索引 4.7 回表查询 4.8 索引覆盖

OuO-1 的博客 1336

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MYSQL——索引下推

理解上面的知识后就可以回答以下问题。二级索引取出的数据是依次回表还是一次回表?答:依次回表。索引下推是为了什么发明的?答:减少回表,而不是避免回表(避免回表用覆盖索引)

ksidgx的博客 1716

mysql创建database_MySQL Create Database 创建数据库

创建数据库CREATE DATABASE 语法用于创建一个数据库。语法:CREATE DATABASE db_namePHP MySQL 函数库中,mysql_query() 函数用于向 MySQL 发送并执行 SQL 语句。关于 mysql_query() 函数更详细信息请参看《MySQL mysql_query》。创建一个名为 testdb 的数据库:$conn = @mysql_connec...

weixin_30921373的博客 4922

mysql索引别名_Mysql索引知识详谈

1. 索引的重要性 索引之于数据表,相当于检字表于汉语字典,设想让你在没有检字表的情况下从字典中找出一个“武”字,你会多么无助,如果用检字表,我们一眼就能找出它在第509页数据库服务器用索引去找到相应的记录,相当于我们使用检字表去找相应的字 2. 预置环境为了更好的描述相关知识,我们先在数据库中创建一张table_demo表,此表仅用于演示后面的相关操作,其设计合理性不在考虑之列,后面所有的操作...

weixin_35406812的博客 341

Mysql索引知识详谈

原文地址:https://www.t-io.org/1159984867644153856 1. 索引的重要性 索引之于数据表,相当于检字表于汉语字典,设想让你在没有检字表的情况下从字典中找出一个“武”字,你会多么无助,如果用检字表,我们一眼就能找出它在第509页 数据库服务器用索引去找到相应的记录,相当于我们使用检字表去找相应的字 [外链图片转存失败(img-RukNbfD8-1566035...

m0_38001657的博客 186
上一篇: MySQL数据库 详谈表的内连和外连
下一篇: MySQL数据库 详谈索引(二)
万我.
博客等级 码龄1年 460粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值