Eu tenho uma subconsulta correlacionada, que está levando 16 minutos para ser executada. Como posso convertê-lo para juntar ou otimizá-lo.
SELECT SSF.SM_StockCode, SSF.ST_ItemSize FROM Stock AS SSF
WHERE SSF.SM_StockCode = (
SELECT SM_StockCode
FROM Stock AS SSFAI
WHERE SSFAI.ST_StockCode = SSF.ST_StockCode
ORDER BY SSFAI.ST_ItemSize ASC
LIMIT 1
) GROUP BY SSF.SM_StockCode
ATUALIZAÇÃO: Adicionado plano de explicação
+----+--------------------+-------+-------+-------------------+------------------+---------+------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+-------+-------------------+------------------+---------+------+-------+----------------------------------------------+
| 1 | PRIMARY | SSF | ALL | NULL | NULL | NULL | NULL | 45180 | Using where; Using temporary; Using filesort |
| 2 | DEPENDENT SUBQUERY | SSFAI | index | ST_StockCode_Indx | ST_ItemSize_Indx | 9 | NULL | 1 | Using where |
+----+--------------------+-------+-------+-------------------+------------------+---------+------+-------+----------------------------------------------+
ATUALIZAÇÃO: Estrutura da tabela
CREATE TABLE `Stock` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ST_StockCode` varchar(20) NOT NULL,
`SM_StockCode` varchar(20) NOT NULL,
`ST_ItemSize` decimal(18,2) NOT NULL,
PRIMARY KEY (`id`),
KEY `ST_StockCode_Indx` (`ST_StockCode`),
KEY `SM_StockCode_Indx` (`SM_StockCode`),
KEY `ST_ItemSize_Indx` (`ST_ItemSize`)
) ENGINE=MyISAM;
Você tem
SELECT SSF.ST_ItemSize
depoisGROUP BY SSF.SM_StockCode
, então está usando uma coluna sem agregação naSELECT
lista, uma coluna que não está naGROUP BY
lista.Isso não é um SQL válido pelo padrão de 1992.
Como
ST_ItemSize
não é a chave primária nem tem uma restrição única, oST_ItemSize
não é funcionalmente dependente dela. Isso torna o código SQL inválido pelos padrões ISO/ANSI mesmo nas versões 2003+ e fornecerá resultados indeterminados (naST_ItemSize
coluna).Infelizmente, o MySQL permite tais consultas (não faz nenhuma verificação de dependência) e é dever do desenvolvedor garantir que uma consulta forneça resultados determinados.
Portanto, aconselho remover essa consulta do seu código, discutir com os desenvolvedores que a escreveram ou os que a usam e descobrir quais resultados ela deve retornar. Então você pode reescrever.
Se você ainda quiser executá-lo até fazer isso, o seguinte produzirá resultados semelhantes - e ganhará eficiência por um índice em
(ST_StockCode, ST_ItemSize, SM_StockCode)
:É um pouco difícil dizer o que você está tentando fazer; o que são
SM_StockCode
eST_StockCode
? Aqui está minha primeira reescrita:Parece que o que você precisa pode ser tão simples quanto isso:
Se você nos desse alguns dados de amostra, eu poderia estar mais confiante.