Técnica 1:Combinar escalares:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Si a es algo así como COUNT(*) , entonces sabes que habrá exactamente un resultado; de ahí el LIMIT 1 es innecesario.
Si una de esas subconsultas no devuelve ninguna fila, obtendrá NULL .
Técnica 2:se puede usar una selección en casi cualquier lugar donde se pueda usar una expresión. Lo anterior es, técnicamente, un ejemplo de ello. También...
SELECT ... WHERE x = ( SELECT ... ) ...
Nuevamente, la subconsulta debe devolver una sola fila para que eso sea posible.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Eso se convierte en algo como esto después de evaluar la subconsulta:
SELECT
WHERE x LIKE '%foo%'
...;
(No es eficiente, pero funciona).
Estos 3 son similares, pero no necesariamente eficientes entre sí:
SELECT ...
WHERE x IN ( SELECT ... )
SELECT ... FROM A
WHERE EXISTS( SELECT ... FROM B
WHERE B.x = A.x )
SELECT ... FROM A JOIN B ON B.x = A.x
Esto es similar pero encuentra los elementos coincidentes que faltan de B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION debe usarse para consultas que tienen un resultado similar:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
Eso producirá cualquier cantidad de filas de A y cualquier cantidad de filas de B. Los duplicados se eliminan si usa UNION DISTINCT , o guardado si usa UNION ALL .
ORDER BY ... LIMIT ... se vuelve complicado OFFSET se vuelve aún más complicado.
Rendimiento
- Evitar
IN ( SELECT ...)suele ser el más lento de los tres. - Evite los comodines iniciales en
LIKE; ver siFULLTEXTsería una mejor opción. INDEX(path),INDEX(parent_id, child_id)("cobertura"),INDEX(scope, path, scope_id); tal vez otros, pero necesito verSHOW CREATE TABLE.- Evite el esquema EAV; es malo para el rendimiento. Agregué un enlace; ver las muchas otras discusiones. También:https://mysql.rjweb.org/doc.php/eav y https://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
Esos elementos son probablemente más importante (para el desempeño) que combinar las declaraciones. Consulte https://meta.stackexchange.com/questions/ 66377/cuál-es-el-problema-xy