2013-11-20 86 views
1

我跑这两个不同的查询,我不明白为什么在第一个销售表不使用索引为什么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

中庸之道,以确保

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

回报探微一行

saleTransactionId是INT(11)的transactionId 这两个表使用的MyISAM

销售指数结构

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

谢谢!

回答

1

因为子查询是一个从属子查询(由于MySQL的工作原理)。这意味着内部查询的结果取决于外部查询。因此,由于内部查询依赖于其结果,因此索引不能用于外部查询。听起来很直观,但这就是发生了什么。

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

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