最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP处理MySQL关联查询

    正文概述 转载于:掘金(柯作)   2021-03-19   702

    PHP处理MySQL关联查询

    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个班级下面的所有学生
    

    PHP处理MySQL关联查询

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

    PHP处理MySQL关联查询

        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添加了索引
    

    PHP处理MySQL关联查询

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

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

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

    PHP处理MySQL关联查询

    PHP处理MySQL关联查询

        ii.现在又这样两组数据
    

    PHP处理MySQL关联查询

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

    PHP处理MySQL关联查询

    PHP处理MySQL关联查询

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

    PHP处理MySQL关联查询

    PHP处理MySQL关联查询

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

    PHP处理MySQL关联查询

    PHP处理MySQL关联查询

    Mysql实战 PHP处理MySQL关联查询


    起源地下载网 » PHP处理MySQL关联查询

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元