Technika 1:Łączenie skalarów:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Jeśli a to coś w stylu COUNT(*) , wtedy wiesz, że będzie dokładnie jeden wynik; stąd LIMIT 1 jest niepotrzebne.
Jeśli jedno z tych podzapytań może nie zwrócić żadnych wierszy, otrzymasz NULL .
Technika 2:Select może być używany prawie wszędzie, gdzie można użyć wyrażenia. Powyższe jest technicznie przykładem takiego. Również...
SELECT ... WHERE x = ( SELECT ... ) ...
Ponownie, podzapytanie musi zwrócić pojedynczy wiersz, aby było to możliwe.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
To wygląda mniej więcej tak po przeanalizowaniu podzapytania:
SELECT
WHERE x LIKE '%foo%'
...;
(Nie jest wydajny, ale działa.)
Te 3 elementy są podobne, ale niekoniecznie wydajne:
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
Działa podobnie, ale znajduje pasujące elementy, których brakuje od B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION powinno być używane dla zapytań, które mają podobny wynik:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
Spowoduje to utworzenie dowolnej liczby wierszy z A i dowolnej liczby wierszy z B. Duplikaty zostaną usunięte, jeśli użyjesz UNION DISTINCT , lub zachowane, jeśli używasz UNION ALL .
ORDER BY ... LIMIT ... staje się trudny. OFFSET staje się jeszcze trudniejsze.
Wydajność
- Unikaj
IN ( SELECT ...)zwykle jest wolniejszy z tych trzech. - Unikaj wiodących symboli wieloznacznych w
LIKE; zobacz, czyFULLTEXTbyłoby lepszą opcją. INDEX(path),INDEX(parent_id, child_id)("pokrycie"),INDEX(scope, path, scope_id); może inne, ale muszę zobaczyćSHOW CREATE TABLE.- Unikaj schematu EAV; to jest złe dla wydajności. dodałem link; zobacz wiele innych dyskusji. Również:https://mysql.rjweb.org/doc.php/eav i https://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp /a>
Te elementy są prawdopodobnie ważniejsze (dla wydajności) niż łączenie ze sobą stwierdzeń. Zobacz https://meta.stackexchange.com/questions/ 66377/co-jest-xy-problemem