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

时间:2018-12-06 03:20:44

标签: 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 = s2_.id -- These line
ORDER BY s0_.updated_at DESC
LIMIT 20 OFFSET 0

如果删除左联接,MariaDB将使用指定的索引,为什么?有什么解决办法吗?

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

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

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

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

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

不要让我删除它。我知道这没有用。而且我认为查询优化器也需要这样考虑,因为它只是向左加入。

我正在使用MariaDB 10.1

1 个答案:

答案 0 :(得分:1)

左联接在订购输出之前需要找到货件的order_id

强制索引通常是错误的事情,即使它可以发现某些事情也是如此。

使用shipment(order_id, updated_at)的复合索引,则无需强制建立索引。

ref:compound indexes query optimization