我是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.shipmentID是int(11)同时o.shipmentAutoMatched的int(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).
所以问题:
int(11),这个问题是如何发生的,它们实际上都存储为int(6)intINT32您正在为子查询使用索引,但在将其传递到 In 后丢失它
将此查询重写为联接,您将看到速度的提高。特别是在旧版本的 mysql 上(新版本具有更好的子查询性能。)
Mysql 非常擅长知道要使用哪个索引。如果它确定一个索引比另一个更好。Mysql一般都是正确的。您可以使用 FORCE INDEX 进行测试。确保在较小的数据集和较大的数据集上使用它以获得真实的图片