PHP处理MySQL关联查询

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 什么关联查询?a)在MySQL中的Select语句中,我们经常会有复杂的业务需要使用join子语句,包括left join、right join、inner join、left outer join、right outer join、full joinb)那么使用以上几种方式进行表查询的时候、对数据库的压力是很大的,怎么个大法呢,我们来测试一下: i.首先我们先搞一些数据 class表200w数据 user表 40w数据 ii.我们接下来查询15个班级下面的所有学生

1、什么关联查询?


a)在MySQL中的Select语句中,我们经常会有复杂的业务需要使用join子语句,包括left join、right join、inner join、left outer join、right outer join、full join
b)那么使用以上几种方式进行表查询的时候、对数据库的压力是很大的,怎么个大法呢,我们来测试一下:
    i.首先我们先搞一些数据 class表200w数据 user表 40w数据
    ii.我们接下来查询15个班级下面的所有学生
复制代码


网络异常,图片无法展示
|


iii.我们看到查询数据一共30w条,耗时1.5秒
    iv.我们使用`explain`来测试sql语句的性能
复制代码


网络异常,图片无法展示
|


1.我们看上上面mysql中的explain语句对当前sql性能的检测,各个字段的含义我们来解释一下其中比较重要的咧
        a)Select_type:查询类型,取值范围(SIMPLE 简单的、PRIMARY 最外层的等等)
        b)Type:重要的项,显示连接使用的类型,按最优到最差的类型排序
            i.System 表仅有一行
            ii.const用于用常数值比较PRIMARY KEY时
            iii.eq_ref除const类型外最好的可能实现的连接类型。它用在一个索引的所有部分被连接使用并且索引是UNIQUE或PRIMARY KEY,对于每个索引键,表中只有一条记录与之匹配
            iv.Ref:连接不能基于关键字选择单个行,可能查找到多个符合条件的行。叫做ref是因为索引要跟某个参考值相比较。这个参考值或者是一个常数,或者是来自一个表里的多表查询的结果值
            v.ref_or_null:如同ref,但是MySQL必须在初次查找的结果里找出null条目,然后进行二次查找
            vi.index_merge:说明索引合并优化被使用了
            vii.unique_subquery:在某些IN查询中使用此种类型,而不是常规的ref:
            viii.ndex_subquery:在某些IN查询中使用此种类型,与unique_subquery类似,但是查询的是非唯一性索引
            ix.Range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range
            x.Index:全表扫描,只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序,但是开销仍然非常大
            xi.All:最坏的情况,从头到尾全表扫描
        c)possible_keys:系统建议使用的索引
        d)Key:当前sql生效的索引
        e)Rows:当前查询扫描了多少行
            i.扫描的行数越少,查询速度越快
            ii.如果是关联查询,那么当前sql的总查询行数等于每一个sql的查询行数乘积
        f)Extra:
            i.Using filesort
            表示MySQL会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。可能在内存或者磁盘上进行排序。MySQL中无法利用索引完成的排序操作称为“文件排序”。
            ii.Using temporary
            表示MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
    2.优化之后的结果
        a)对user表中的cid添加了索引
复制代码


网络异常,图片无法展示
|


b)即便如此,mysql也对数据库进行了10*41014共计410140行的扫描
    3.在公司中,一般情况是不允许使用join子语句的,因为消耗太大了,那么我们一般会采用
        a)数据字段冗余的方法减少关联查询,但是又增加了数据量
        b)使用mysql逻辑进行数据的关联查询,也是我们要讲的
复制代码


2、如何使用php代替关联查询


a)思路:通过php单独对各个表进行查询,然后使用php进行数据的整合实现关联查询的效果,因为单独执行sql可以减少mysql对数据的扫描行数,从而提高效率
b)实现方式:
    i.Array_column:从一个数组中取出指定的一列数据
复制代码


网络异常,图片无法展示
|

网络异常,图片无法展示
|


ii.现在又这样两组数据
复制代码


网络异常,图片无法展示
|


1.将这两组数据根据cid进行合并,显示用户所属班级
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


2.这样的实现方式,循环嵌套过多,php效率也不高,如果再实现多表联查那就循环就更多了
    iii.正确是合并方法
    1.一定要利用好数组key
    2.步骤:
        a)用户与班级是 多/一 的关系
        b)将 班级(一)数据中的关联id(cid)变为数组的下标
复制代码


网络异常,图片无法展示
|

网络异常,图片无法展示
|


c)然后通过用户(多)循环遍历,数据中的cid去班级数组中查询对应的班级名称
复制代码


网络异常,图片无法展示
|


网络异常,图片无法展示
|


Mysql实战


网络异常,图片无法展示
|


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
关系型数据库 MySQL 网络安全
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
132 25
|
9天前
|
JSON PHP 数据库
PHP成绩查询系统源码
PHP成绩查询系统源码
569 3
|
18天前
|
算法 关系型数据库 MySQL
join查询可以⽆限叠加吗?MySQL对join查询有什么限制吗?
大家好,我是 V 哥。本文详细探讨了 MySQL 中 `JOIN` 查询的限制及其优化方法。首先,`JOIN` 查询不能无限叠加,存在资源(CPU、内存、磁盘 I/O)、性能和语法等方面的限制。过多的 `JOIN` 操作会导致数据库性能急剧下降。其次,介绍了三种常见的 `JOIN` 查询算法:嵌套循环连接(NLJ)、索引嵌套连接(INL)和基于块的嵌套循环连接(BNL),并分析了它们的触发条件和性能特点。最后,分享了优化 `JOIN` 查询的方法,包括 SQL 语句优化、索引优化、数据库配置调整等。关注 V 哥,了解更多技术干货,点赞👍支持,一起进步!
|
16天前
|
监控 定位技术 PHP
使用PHP接入纯真IP库:实现IP地址地理位置查询
本文介绍了如何使用PHP接入纯真IP库(QQWry),实现IP地址的地理位置查询。纯真IP库是一个轻量级的IP数据库,数据格式简单,查询速度快,适合Web应用。首先,下载并放置`QQWry.dat`文件到项目目录。接着,通过编写PHP类解析该文件,实现IP查询功能。最后,提供了一个完整的案例演示,展示如何查询IP地址对应的国家和地区信息。该工具适用于用户地理位置分析、访问日志分析和风控系统等场景,具有轻量级、查询速度快、数据更新方便等优点。
|
22天前
|
Oracle 关系型数据库 MySQL
【YashanDB 知识库】php 查询超过 256 长度字符串,数据被截断的问题
php 查询超过 256 字节数据,显示被截断:yashandb 的 odbc 驱动接口 SQLGetData 现在只支持单次查询,不支持多次取数据的操作。 isql 显示不出来,isql 工具最大只查询 300 长度的数据,超过了该长度未正常显示。
|
3月前
|
SQL 关系型数据库 MySQL
【MySQL基础篇】多表查询(隐式/显式内连接、左/右外连接、自连接查询、联合查询、标量/列/行/表子查询)
本文详细介绍了MySQL中的多表查询,包括多表关系、隐式/显式内连接、左/右外连接、自连接查询、联合查询、标量/列/行/表子查询及其实现方式,一文全面读懂多表联查!
【MySQL基础篇】多表查询(隐式/显式内连接、左/右外连接、自连接查询、联合查询、标量/列/行/表子查询)
|
3月前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
92 8
|
3月前
|
SQL 关系型数据库 MySQL
MySQL 窗口函数详解:分析性查询的强大工具
MySQL 窗口函数从 8.0 版本开始支持,提供了一种灵活的方式处理 SQL 查询中的数据。无需分组即可对行集进行分析,常用于计算排名、累计和、移动平均值等。基本语法包括 `function_name([arguments]) OVER ([PARTITION BY columns] [ORDER BY columns] [frame_clause])`,常见函数有 `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`, `SUM()`, `AVG()` 等。窗口框架定义了计算聚合值时应包含的行。适用于复杂数据操作和分析报告。
196 11
|
2月前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
510 0
|
3月前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
216 6