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 seFULLTEXT
seria 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:http://mysql.rjweb.org/doc.php/eav e http://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