mysql 多表关联查询如何加快速度_多表关联查询还会走索引吗

mysql 多表关联查询如何加快速度_多表关联查询还会走索引吗这个问题出现在多表关联时, 如一张商品表,其中的单位的字符串表示是在单位表中, 但这个单位的id之后进行了删除,并且不再奏效。 如下: select * from (select pg0.id,pg0

mysql多表关联时可能出错的地方,如搜索出的记录数据变少了。

这个问题出现在多表关联时,
如一张商品表,其中的单位的字符串表示是在单位表中,
但这个单位的id之后进行了删除,并且不再奏效。
如下:

 select *
        from (select pg0.id,pg0.init_size,pg0.goods_id,
        pg0.goods_move_size,pg0.execution,pg0.operation,
        pg0.create_time,pg0.update_time
        from psog_purchase_log pg0 where pg0.is_del=0
        and pg0.store_log_id = 15)pg
        left join psog_goods g on pg.goods_id = g.id
        left join psog_cate c on g.cate_id = c.id
        left join psog_unit u on g.unit_id = u.id
        where g.is_del = 0 and c.is_del = 0 and u.is_del = 0

可以看到最终where语句判定u.is_del=0,判定单位表不为空
但其实有时要查询的是一些记录数据,可能跟这个值关系不大,及时后来商品单位为空了也无所谓,
那么就可能改为下面这样:

        select *
        from (select pg0.id,pg0.init_size,pg0.goods_id,
        pg0.goods_move_size,pg0.execution,pg0.operation,
        pg0.create_time,pg0.update_time,pg0.is_del
        from psog_purchase_log pg0 where pg0.is_del=0
        and pg0.store_log_id = #{storeLogId})pg
        left join
        (select g0.id,g0.cate_id,g0.unit_id,g0.goods_name,g0.goods_code,g0.is_del from psog_goods g0 where g0.is_del=0)g
        on pg.goods_id = g.id
        left join
        (select c0.id,c0.is_del,c0.cate_name from  psog_cate c0 where c0.is_del=0)c
        on g.cate_id = c.id
        left join (select u0.unit,u0.id,u0.is_del from psog_unit u0 where u0.is_del=0)u
        on g.unit_id = u.id

可以看到上面每个判定数据有效的is_del在单独的关联时就已经做了排查,
这样的作用是基于最left的表为基准,之后的即使未关联到的某id=某id,
那么要查询的select * 里面的数据只变为空,而该行数据以最左边的表,即pg表为基准不管其它关联与否,要查询的
字段空与不空关系不是太大。

总结:
上面的sql查询时必须要能关联到类似商品分类商品单位名称的等等数据时才可以,否则那一行不予返回
而下面的这个sql只要pg表能查到那么之后的不管子表数据删除了没有,主表的数据还会展示

原文地址:https://www.cnblogs.com/ukzq/archive/2022/05/12/16263415.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5264.html

(0)
上一篇 2023-05-16
下一篇 2023-05-16

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注