A consulta abaixo está demorando muito - cerca de 540 segundos.
A tabela não tinha nenhum índice. Criei índices nas colunas da
WHERE
cláusula e outros campos mas a consulta não está utilizando esses índices.- Sugira bons índices para esta consulta.
Consulta:
select
alias_to,
fake_uri,
concat(ifnull(parameters,''),ifnull(parameters2,''),ifnull(parameters3,'')) as parameters,
precedence,
template_name
from site_map_template
order by precedence, fake_uri desc;
Explique a saída:
+----+-------------+-------------------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+------+---------------+------+---------+------+------+----------------+
| 1 | SIMPLE | site_map_template | ALL | NULL | NULL | NULL | NULL | 7616 | Using filesort |
+----+-------------+-------------------+------+---------------+------+---------+------+------+----------------+
1 row in set (0.00 sec)
tabela site_map_template:
CREATE TABLE `site_map_template` (
`row_mod` datetime DEFAULT NULL,
`row_create` datetime DEFAULT NULL,
`template_name` varchar(50) COLLATE latin1_bin DEFAULT NULL,
`alias_to` varchar(100) COLLATE latin1_bin DEFAULT NULL,
`package` varchar(50) COLLATE latin1_bin DEFAULT NULL,
`fake_uri` varchar(255) COLLATE latin1_bin DEFAULT NULL,
`precedence` int(11) DEFAULT NULL,
`parameters` varchar(255) COLLATE latin1_bin DEFAULT NULL,
`parameters2` varchar(255) COLLATE latin1_bin DEFAULT NULL,
`parameters3` varchar(255) COLLATE latin1_bin DEFAULT NULL,
KEY `idx_1372` (`template_name`),
KEY `idx_n1` (`precedence`),
KEY `idx_n2` (`fake_uri`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin
Usando o SQL Server 2012 (espero que haja um equivalente no MySQL):
Um bom índice clusterizado para esta consulta é:
Ou, um índice não clusterizado:
A consulta (novamente, na sintaxe do SQL Server) é:
E o plano de execução é uma simples varredura do índice:
Ou, usando o índice não clusterizado:
O importante em ambos os casos é que cada índice cubra todas as colunas necessárias para a consulta, e as chaves de índice são precedência ASC e fake_uri DESC . Sem a segunda chave descendente, seria necessária uma classificação completa, e esta é provavelmente a causa do seu desempenho lento.