我正在运行这两个不同的查询,我不明白为什么在第一个sale表索引上不使用
EXPLAIN SELECT COUNT(`sale`.`saleId`) AS `nb`
FROM `sale`
WHERE `sale`.`saleTransactionId` IN (
SELECT `transaction`.`transactionId`
FROM `transaction`
WHERE `transaction`.`transactionId` = 87587
)
结果是
result 1 http://snag.gy/SusqF.jpg
第二个
EXPLAIN SELECT COUNT(`sale`.`saleId`) AS `nb`
FROM `sale`
WHERE `sale`.`saleTransactionId` IN (87587)
结果是
result 2 http://snag.gy/ZgOXQ.jpg
只是确定
SELECT `transaction`.`transactionId`
FROM `transaction`
WHERE `transaction`.`transactionId` = 87587
只返回一行
saleTransactionId是INT(11)作为transactionId
两个表都使用MyISAM
销售指标结构
sale index structure http://snag.gy/we3HL.jpg
谢谢!
最佳答案
因为子查询是一个依赖子查询(由于MySQL是如何工作的)。这意味着内部查询的结果取决于外部查询。因此,索引不能用于外部查询,因为内部查询依赖于其结果。听起来有悖常理,但事实就是如此。
至于解决方案:不要使用子查询。使用连接。
SELECT COUNT(saleId) AS nb
FROM sale
JOIN transaction ON (saleTransactionId = transactionId)
WHERE transactionId = 87587