Técnica 1:Combinando escalares:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Se
a é algo como COUNT(*) , então você sabe que haverá exatamente um resultado; daí o LIMIT 1 é desnecessário. Se uma dessas subconsultas não retornar nenhuma linha, você obterá
NULL . Técnica 2:Um select pode ser usado em quase qualquer lugar em que uma expressão possa ser usada. O acima é, tecnicamente, um exemplo disso. Também...
SELECT ... WHERE x = ( SELECT ... ) ...
Novamente, a subconsulta deve retornar uma única linha para tornar isso possível.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Isso se torna algo assim depois que a subconsulta é avaliada:
SELECT
WHERE x LIKE '%foo%'
...;
(Não é eficiente, mas funciona.)
Estes 3 são semelhantes, mas não necessariamente eficientes entre si:
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
Isso é semelhante, mas encontra os itens correspondentes que estão ausentes de B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION deve ser usado para consultas que têm saída semelhante:SELECT x,y FROM A
UNION
SELECT x,y FROM B
Isso produzirá qualquer número de linhas de A e qualquer número de linhas de B. As duplicatas serão removidas se você usar
UNION DISTINCT , ou mantido se você usar UNION ALL . ORDER BY ... LIMIT ... fica complicado. OFFSET fica ainda mais complicado. Desempenho
- Evite
IN ( SELECT ...)geralmente é o mais lento dos três. - Evite caracteres curinga em
LIKE; veja seFULLTEXTseria uma opção melhor. INDEX(path),INDEX(parent_id, child_id)("cobrindo"),INDEX(scope, path, scope_id); talvez outros, mas preciso verSHOW CREATE TABLE.- Evite o esquema EAV; é ruim para o desempenho. Eu adicionei um link; veja as muitas outras discussões. Também:https://mysql.rjweb.org/doc.php/eav e https://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
Esses itens são provavelmente mais importante (para o desempenho) do que combinar as declarações. Consulte https://meta.stackexchange.com/questions/ 66377/qual-é-o-problema-xy