假设发货和订单表中都有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条答案
按热度按时间20jt8wwn1#
左连接需要找到
order_id
在订购产品之前。强制索引通常是错误的,即使它可以发现一些东西。
使用复合索引
shipment(order_id, updated_at)
不需要强制索引。参考:复合指数优化