2013-11-20 2 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

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

Поскольку подзапрос является зависимым подзапросом (из-за того, как работает MySQL). Это означает, что результат внутреннего запроса зависит от внешнего запроса. Таким образом, индекс не может использоваться для внешнего запроса, поскольку внутренний запрос зависит от его результатов. Звучит контрастно интуитивно, но это то, что происходит.

Что касается решения: не используйте подзапрос. Используйте JOIN.

SELECT COUNT(saleId) AS nb 
FROM sale 
JOIN transaction ON (saleTransactionId = transactionId) 
WHERE transactionId = 87587 
Смежные вопросы