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 siFULLTEXT
serí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:http://mysql.rjweb.org/doc.php/eav y http://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