sql >> Base de Datos >  >> RDS >> Mysql

Arreglar usando donde; Uso temporal; Uso de clasificación de archivos

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.