php数据库查询-从浅层到深层了解 MySQL 的底层查询逻辑

2023-08-21 0 1,407 百度已收录

1. MySQL 架构

逻辑设计 1.1 MySQL 逻辑架构图

MySQL的架构一般分为四层:

1.2 什么是 MySQL 高性能?

每个人对什么是高性能都有不同的答案,例如:“每秒查询数”、“CPU 利用率”、“可扩展性”。“高性能 MySQL”中给出的定义是“响应时间”,感觉 CPU 使用率作为高性能的指标是一个悖论,而低 CPU 使用率只是说明性能差对 CPU 使用率不高,真正有效的是“查询响应时间”。

MySQL 的高性能主要体现在读写上,在写字层面,公司的 DBA 已经进行了主从主备高可用部署,同时对重做日志、二进制日志等都有很好的管理,基于我们目前对快速阅读的需求更多,本文主要讲解如何读取高性能?

1.3 基本概念

原则第一,实践第二,我们需要了解MySQL优化中常见的基本概念。

(1) 数据页

为了避免逐个读取C盘上的数据,InnoDB采用页面的形式作为C盘和显存之间交互的基本单元。页面大小通常为 16KB。

页面存储的过程:

(1)在页面生成开始时,没有用户记录部分。

(2) 插入记录时,从自由空间请求记录大小的空间,并将其定义为用户记录部分。

(3)当自由空间中的所有空间都被用户记录部分替换时,页面就用完了,如果插入了新记录,则需要申请新页面。

(2)返回表

众所周知,Mysql 默认使用 InnoDB 数据库,引擎使用的数据结构是 B+ 树,如果基于化学存储方法,索引分类分为聚簇索引和非聚簇索引。

集群索引:字段索引;非聚集索引:非字段索引

1.4

缓存命中和LRU算法 1.4.1 缓冲池缓冲池

我们上面提到,Mysql 在查询时首先命中缓存,这里的缓冲区称为“缓冲池”。

缓冲池在内部将其存储为哈希结构。优化器将从该表对应的“表空间+页码”中计算出键,然后传递 value 对应的缓冲区页的控制块

缓冲池 它有一个固定的大小,尽管我们每页有 16KB 的数据。而如果数据页较多,则难免缓冲池已满,数据页将被LRU算法淘汰。虽然也可以理解,LRU还存储“表空间+页码”数据。

1.4.2 LRU算法

策略:缓冲区的数据更新通过 LRU 算法更新,其策略为:“最近最少使用”。

结构:在InnoDB实现中,整个LRU阵列按照5:3的比例分为年轻区域和旧区域。前5/8是年轻一代,后3/8是老年。

算法:新

读取的数据将存储在旧区域中,下一个新数据将

插入旧区域前面,以后会移动原始数据;

如果数据在旧区域存在超过 1 秒,

它将前进到第一位,步入年轻区域,并将其他数据依次向前移动 1 秒以上;

对于年轻区域中的数据访问,访问的数据将向前移动到第一个位置

根据

以前的LRU算法,如果扫描全表,全表扫描的数据不会写入缓存,命中年轻区域。

在扫描过程中,新插入的数据页被放置在旧区域;

如果一个数据页有多条记录,该数据页会被多次访问,但由于是顺序扫描,该数据页第一次访问和最后一次访问的间隔不会超过1秒,所以它仍然会保留在旧区域;

如果继续扫描后续数据,以后不会访问之前的数据页,因此没有机会移动到阵列的颈部(即年轻区域),很快就会被淘汰。

2. 索引优化 2.1索引结构

2.1.1 常用索引结构模型(1)哈希表,链表

+数组行公式,这些结构适用于等值查询的场景(2)有序链表,仅从查询效率来看,查询快更新慢,所以有序链表只适合静态存储引擎(3)搜索树,平衡二叉树查询和更新时间复杂度为O(log(n)), InnoDB引擎使用B+树;(4)数据库技术将发展到明天,跳转表和LSM树等数据结构也将用于引擎设计

2.1.2B+树

1)从“B+树”+“数据页”的角度理解索引的查询逻辑,能更清楚地了解查询过程。(

2)B+树的时间复杂度:O(logN),上面我们要找6个,我们只需要查询两次。

(3)通过上面的搜索过程,我们可以看到,页数越少,级别越浅,越容易找到。因此,在索引创建规则中:“索引越小越好(即索引应该是可识别的)”2.2 索引

优化 2.2.1 索引分类

根据化学品储存方法,索引可分为:聚簇索引(字段索引)和非聚簇索引(二级索引)。

因此,当二级索引查询非索引数组时,它需要返回到表中。

2.2.2 索引之间的异同

覆盖索引是只能从索引中获取的选定数据列,不必查看数据行,换句话说,查询列必须被构建的索引覆盖。

优点:防止返回表,覆盖索引权限较大,可以忽略最左边的匹配原则

缺点:需要创建大量复合索引,建议单表索引数量大于5个最左边

的前缀可以是联合索引最左边的第 N 个数组,也可以是字符串索引最左边的 N 个字符

这里需要注意的是,比如“wherenamelike 'zhang%'”,通常喜欢不去索引,而索引支持最左边的字符匹配,所以匹配的字符去索引

创建复合索引时,需要

注意顺序,如果(aphp数据库查询,b)存在,则无需构建额外的A索引以节省空间

(姓名,年龄),选择*从表哪里名称像'zhan%'andage=10andmale=1,这里使用什么索引?它比单个索引快一点吗?

根据

最左边匹配,虽然年龄索引无效,并且会起到过滤作用,但不需要返回表过滤查询 age=10,取值直接取自二级索引,称为“索引下沉”。

是否要一起对多个数组进行模糊查询,只要一个数组匹配,即显示结果?

这可以是

使用全文索引实现,这是一个FultLeXT类型的索引php数据库查询,只能用于InnoDB或MyISAM表,并且只能为CHAR,VARCHAR,TEXT列创建,MySQL 5.7.6支持英语。

索引的最终选择是优化器的责任,优化程序是根据以下条件选择的:扫描的行数、临时表、排序

3. 总结

我们从 MySQL 查询链接的架构设计和存储查询的数学逻辑中得到上面的逻辑图,所以在日常的 MySQL 查询中,我们应该考虑创建一个合适的索引来提高 MySQL 查询的性能。

看完两件事

如果你觉得这篇文章对你很有启发,我想请你帮我做两件小事

1. 点击“观看”

让更多人也能看到这个内容(点击“观看”,bug-1)。

2、关注公众号“政府采购云科技”,持续为您推送精选文章

职业

政府采购云技术团队(零),西安基地,一个充满激情和技术独创性的成长团队。规模约500人,除日常业务拓展外,还在云原生、区块链、人工智能、低代码平台、中间件、大数据、物料系统、工程平台、性能体验、可视化等领域进行技术探索和实践,推广和实施一系列内部技术产品,不断探索技术新边界。据悉,该团队还参与了社区建设,并长期为Google Flutter、scikit-learn、ApacheDubbo、ApacheRocketmq、ApachePulsar、CNCFDapr、ApacheDolphinScheduler、alibabaSeata等众多优秀开源社区做出了贡献。

如果你想改变,仍然被事物折磨,希望开始折腾;想要改变,还是建议少想,但不能打破游戏;如果你想改变你实现这个结果的能力,你不需要;如果你想改变你想要实现的目标,你需要一个团队来支持,但你没有领导人的位置;如果要改原惠根还不错,但总有那层阳台纸模糊不清......如果你相信相信的力量,相信平凡的人可以成就不平凡的事情,相信你能遇到更好的自己。如果你想参与到业务腾飞的过程中,亲自推动一个对业务有深刻理解、技术体系完善、技术创造价值、影响溢出的技术团队的成长,我觉得我们应该谈谈。任何时候,等待你写一些东西,把它发送到 zcy-tc@cai-inc.com

好的php 查询数据库,让我回答你的问题。首先,我们可以通过 PHP 连接到 MySQL 数据库,并使用 SQL 语句来实现添加、删除、修改和检查功能。以下是中学生成绩管理系统的简单实现思路: 1.创建一个数据库和数据表,首先我们需要创建一个MySQL数据库,然后在数据库中创建一个数据表来存储中学生的表现信息。例如,我们可以创建一个名为“student”的数据表,其中包含以下数组: -id:初中学生ID,自降序整数类型 -name:初中学生姓名,字符串类型 -score:初中学生成绩,整数类型可以使用以下SQL句子创建: ''sqlCREATETABLE'student'('id'int(11)NOTNULLAUTO_INCREMENT,' name'varchar(50)NOTNULL,'score'int(11)NOTNULL,PRIMARYKEY('id'))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;'''2.To 加入数据库,我们需要用PHP代码连接到MySQL数据库。您可以使用以下代码加入默认的本地MySQL服务器:'''php$host=“localhost”;//MySQL服务器地址$username=“root”;//MySQL username$password=“123456”;//MySQL password$database=“test”;//database name//创建与MySQL服务器的联接 $conn=mysqli_connect($host,$username,$password,$database);//检测联接成功,如果(!$conn){die(“Join failed:”.mysqli_connect_error()); }'''3、实现增、删、修改、检出功能php 查询数据库,可根据用户需求实现增、删、修改、查核功能。

以下是一些示例代码: (1)添加中学生成绩信息:“php$name=$_POST[”name“];//Get Middle School

php数据库查询-从浅层到深层了解 MySQL 的底层查询逻辑

学生姓名 $score=$_POST[“score”];//获取中学生成绩//使用 SQL 将中学生的成绩记录添加到数据表中 插入句子$sql=“INSERTINTOstudent(name,score)VALUES( '$name',$score)”; if(mysqli_query($conn,$sql))){echo“添加成功!"; }else{echo“Add failed: ”.mysqli_error($conn); }'''(2)删除中学生成绩信息:“php$id=$_GET[”id“];//获取要删除的中学生ID//使用SQL从数据表中删除指定中学生成绩记录的句子$sql=”DELETEFROMstudentWHEREid=$id“;if(mysqli_query($conn,$sql))){echo“删除成功!"; }else{echo“ delete failure: ”.mysqli_error($conn); }'''(3)更改中学生成绩信息:“php$id=$_POST[”id“];//获取中学生ID$name=$_POST[”姓名“];//获取中学生姓名$score=$_POST[”分数“];//获取中学生成绩//使用SQL更新句子 更改指定的中学生成绩记录$sql=”UPDATEstudentSETname='$name',score=$scoreWHEREid=$id“;if(mysqli_query($conn,$sql))){echo“Change success!"; }else{echo“ 更改失败: ”.mysqli_error($conn); }'''(4)查询中学生成绩信息:“”php//使用SQL查询句从数据表中查询所有中学生成绩记录$sql=“SELECT*FROMstudent”;$result=mysqli_query($conn,$sql);//遍历查询结果并输出每条记录,而($row=mysqli_fetch_assoc($result)){echo“ID:”.$row[“id”].“, 名称: ”.$row[“名称”].“

php数据库查询-从浅层到深层了解 MySQL 的底层查询逻辑

, 等级: ”.$row[“分数”].”

“; }'''以上是中学生年级管理系统的简单实施思路,您可以根据需要进行更改和改进。

php数据库查询-从浅层到深层了解 MySQL 的底层查询逻辑

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 php php数据库查询-从浅层到深层了解 MySQL 的底层查询逻辑 https://www.wkzy.net/game/132747.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务