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

mysql:elegir la consulta más eficiente de las dos

No hay duda de que la versión 1 (cláusulas where separadas en cada lado de la unión) será más rápida. Veamos por qué la versión, donde la cláusula sobre el resultado de la unión, es peor:

  • volumen de datos:siempre habrá más filas en el resultado de la unión, porque hay menos condiciones sobre qué filas se devuelven. Esto significa más E/S de disco (según los índices), más almacenamiento temporal para contener el conjunto de filas, lo que significa más tiempo de procesamiento
  • escaneo repetido:todo el resultado de la unión se debe escanear nuevamente para aplicar la condición, cuando podría haberse manejado durante el escaneo inicial. Esto significa manejar dos veces el conjunto de filas, aunque probablemente en la memoria, aún así es un trabajo extra.
  • los índices no se utilizan para las cláusulas where en un resultado de unión. Si tiene un índice sobre los campos de clave externa y postType, no se usaría

Si desea el máximo rendimiento, use UNION ALL , que pasa las filas directamente al resultado sin sobrecarga, en lugar de UNION , que elimina los duplicados (normalmente ordenándolos) y puede resultar costoso e innecesario según sus comentarios

Defina estos índices y use la versión 1 para obtener el máximo rendimiento:

create index t1_authorID_postType on t1(authorID, postType);
create index t1_websiteID_postType on t1(websiteID, postType);