mysql - MariaDB/MySQL : Index hint ignored when there is left join

标签 mysql join indexing mariadb

考虑发货表和订单表中都有 2M 条记录。

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 是由库生成的,我修复它的选项有限。

不要要求我删除它。我知道它没有用。我认为查询优化器也需要这样考虑,因为它只是LEFT JOIN。

我使用的是 MariaDB 10.1

最佳答案

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

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

使用shipment(order_id, Updated_at)复合索引,您无需强制使用索引。

引用:compound indexes query optimization

关于mysql - MariaDB/MySQL : Index hint ignored when there is left join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53644130/

相关文章:

mysql - 合并两个表中的数据 SQL

mysql - 避免Mysql左连接查询中的重复

sqlite - 是否可以在 sqlite 中创建临时索引?

mongodb - Elasticsearch ,MongoDB:Mongo-Connector自定义映射和设置

mysql - 如何改进此表的索引

mysql - SQLException。导出到 mysql 时 PIG 出现 JDBC 错误

mysql - Laravel 的 View 的 ajax 命名路由

mysql - 如果存在特定 id,则将 json 值提取到列中

mysql - 从 MySQL 和 Codeigniter 中的同一 JOIN 获取多个值

mysql - 获取mysql中两个逗号分隔值之间的差异