Parece que, por alguna razón, MySQL
elige usar el índice SIL
en la primera tabla y la usa para buscar (WHERE sil_id = 4601038
) y agrupación (GROUP BY cu.Id
).
Puedes decirle que use el PK
de la mesa
SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
USE INDEX FOR JOIN (PRIMARY)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id
y producirá este plan de ejecución:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
---+-------------+-------+-------+---------------+---------+---------+------------------+------+-------------
1 | SIMPLE | cu | index | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where
1 | SIMPLE | p | ref | CatUrl | CatUrl | 4 | cbs-test-1.cu.Id | 1 | Using index
Ignorar los valores informados en la columna rows
; no son correctos porque mis tablas están vacías.
Observe el Extra
la columna ahora contiene solo Using where
pero también observe que la combinación type
columna cambiada de ref
(muy bueno) a index
(escaneo de índice completo, no del todo bueno).
Una mejor solución es agregar un índice en la columna SIL_Id
. Lo sé, SIL_Id
es un prefijo del índice SIL(SIL_Id, AsCatId)
y en teoría otro índice en la columna SIL_Id
es completamente inútil. Pero parece que resuelve el problema en este caso.
ALTER TABLE cat_urls
ADD INDEX (SIL_Id)
;
Ahora utilícelo en la consulta:
SELECT cu.Href, COUNT(p.CatUrlId) FROM cat_urls cu
USE INDEX FOR JOIN (SIL_Id)
JOIN products p ON p.CatUrlId=cu.Id
WHERE sil_id=4601038
GROUP by cu.Id
El plan de ejecución de consultas se ve mucho mejor ahora:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
---+-------------+-------+------+---------------+--------+---------+------------------+------+-------------
1 | SIMPLE | cu | ref | SIL_Id | SIL_Id | 4 | const | 1 | Using where
1 | SIMPLE | p | ref | CatUrl | CatUrl | 4 | cbs-test-1.cu.Id | 1 | Using index
El inconveniente es que tenemos un índice extra que es (teóricamente) inútil. Ocupa espacio de almacenamiento y consume ciclos de procesador cada vez que se agrega, elimina o tiene una fila SIL_Id
campo modificado.