int(11)和int(6)会导致索引问题吗?

yao*_*ing 6 mysql sql

我是MySQL的新手.所以我发现有人在我们的生产环境中写了一些SQL:

SELECT o.`erp_orders_id`
FROM `erp_orders` o
WHERE o.`orders_status`> 2
  AND o.`orders_status`< 5
  AND o.`shipmentAutoMatched` IN
    (SELECT s.`shipmentID`
     FROM `erp_shipment` s
     WHERE s.`shipmentScanLocal` = 2)
Run Code Online (Sandbox Code Playgroud)

这里s.shipmentIDint(11)同时o.shipmentAutoMatchedint(6).
此查询命中索引

IDX_OR_OR_CU(orders_status, orders_type, currency_type)
Run Code Online (Sandbox Code Playgroud)

虽然我实际上有另一个索引:

IDX_OR_SH(orders_status, shipmentAutoMatched)
Run Code Online (Sandbox Code Playgroud)

我认为可能更有效率.如果我将IN指令更改为数字,如:

IN(10, 11, 12)
Run Code Online (Sandbox Code Playgroud)

IDX_OR_SH正确命中.所以我认为唯一的问题可能是关于int(11)int(6).

所以问题:

  1. 我对么?
  2. 当这两个问题发生时int(11),这个问题是如何发生的,它们实际上都存储为int(6)intINT32
  3. 我该如何解决这个问题?

exu*_*sum 0

您正在为子查询使用索引,但在将其传递到 In 后丢失它

将此查询重写为联接,您将看到速度的提高。特别是在旧版本的 mysql 上(新版本具有更好的子查询性能。)

Mysql 非常擅长知道要使用哪个索引。如果它确定一个索引比另一个更好。Mysql一般都是正确的。您可以使用 FORCE INDEX 进行测试。确保在较小的数据集和较大的数据集上使用它以获得真实的图片