为什么MySQL不使用索引

时间:2013-11-20 17:34:23

标签: mysql

我正在运行这两个不同的查询,我不明白为什么第一个销售表索引没有使用

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

Juste肯定

SELECT `transaction`.`transactionId`
FROM `transaction`  
WHERE `transaction`.`transactionId` = 87587

返回juste一行

saleTransactionId是INT(11)作为transactionId 两个表都使用MyISAM

销售指数结构

sale index structure http://snag.gy/we3HL.jpg

谢谢!

1 个答案:

答案 0 :(得分:1)

因为子查询是依赖子查询(由于MySQL如何工作)。这意味着内部查询的结果取决于外部查询。因此,索引不能用于外部查询,因为内部查询依赖于其结果。听起来很直观,但这就是发生的事情。

至于解决方案:不要使用子查询。使用JOIN。

SELECT COUNT(saleId) AS nb
FROM sale
JOIN transaction ON (saleTransactionId = transactionId)
WHERE transactionId = 87587