MariaDB/MySQL:存在左连接时忽略索引提示

MariaDB/MySQL:存在左连接时忽略索引提示,mysql,join,indexing,mariadb,Mysql,Join,Indexing,Mariadb,考虑到发货和订单表中都有200万条记录 SELECT DISTINCT s0_.id AS id0, s0_.updated_at AS updated_at1 FROM `shipment` s0_ LEFT JOIN `order` s1_ ON s0_.order_id = s1_.id -- These line LEFT JOIN `address` s2_ ON s1_.shipping_address_id =

考虑到发货和订单表中都有200万条记录

SELECT DISTINCT
    s0_.id         AS id0,
    s0_.updated_at AS updated_at1
FROM
    `shipment` s0_
        LEFT JOIN `order` s1_ ON s0_.order_id = s1_.id -- These line
        LEFT JOIN `address` s2_ ON s1_.shipping_address_id = s2_.id -- These line
ORDER BY s0_.updated_at DESC
LIMIT 20 OFFSET 0
如果我删除左连接,我将使用指定的索引,为什么?有什么解决办法吗

此SQL是由库生成的,我只有有限的选项来修复它。

此SQL是由库生成的,我只有有限的选项来修复它。

此SQL是由库生成的,我只有有限的选项来修复它。

此SQL是由库生成的,我只有有限的选项来修复它。

此SQL是由库生成的,我只有有限的选项来修复它。

不要让我把它拿走。我知道这没有用。我认为查询优化器也需要这样考虑,因为它只是LEFTJOIN


我正在使用MariaDB 10.1

左连接需要在订购输出之前找到装运的
订单id

强制索引通常是错误的,即使它可以发现一些东西

使用
shipping(order\u id,updated\u at)
的复合索引,您无需强制索引

参考:

EXPLAIN{query}
SHOW CREATE TABLE shipping
SHOW CREATE TABLE orders
查看您有哪些索引。进行一些优化。在Pagerfanta库中将
LEFT JOIN
s报告为bug:-)对您使用的代码负责。您可以分叉项目并修复它。我真的想删除这个问题我认为你是正确的,但是看到优化器像这样处理这个查询也是愚蠢的,因为它只是离开了,你能检查更新的问题吗?如果只有一个直接左连接,但不像我删除DISTINCT时更新的查询那样,那么您的解决方案是有效的,而且速度很快。s0_.id已经是主键。是否需要添加唯一约束?它会工作吗?主键总是唯一的,所以是的,不需要distinct<代码>解释和
显示创建表
信息请。
地址
上的附加联接不用于结果集或任何过滤方面。整个查询由Pagerfanta生成