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, czyFULLTEXT
był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ż:http://mysql.rjweb.org/doc.php/eav i http://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