Teknik 1:Kombinera skalärer:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Om a
är ungefär COUNT(*)
, då vet du att det blir exakt ett resultat; därav LIMIT 1
är onödigt.
Om en av dessa underfrågor kanske inte returnerar några rader får du NULL
.
Teknik 2:En select kan användas nästan överallt där ett uttryck kan användas. Ovanstående är tekniskt sett ett exempel på sådant. Också...
SELECT ... WHERE x = ( SELECT ... ) ...
Återigen måste underfrågan returnera en enda rad för att göra det möjligt.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Det blir ungefär så här efter att underfrågan har utvärderats:
SELECT
WHERE x LIKE '%foo%'
...;
(Det är inte effektivt, men det fungerar.)
Dessa 3 är lika, men inte nödvändigtvis effektiva som varandra:
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
Detta är liknande men hittar de matchande objekten som saknas från B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION
ska användas för frågor som har liknande utdata:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
Det ger valfritt antal rader från A och valfritt antal rader från B. Dubletter tas bort om du använder UNION DISTINCT
, eller behålls om du använder UNION ALL
.
ORDER BY ... LIMIT ...
blir knepigt. OFFSET
blir ännu knepigare.
Prestanda
- Undvik
IN ( SELECT ...)
det är vanligtvis den långsammare av de tre. - Undvik ledande jokertecken i
LIKE
; se omFULLTEXT
skulle vara ett bättre alternativ. INDEX(path)
,INDEX(parent_id, child_id)
("covering"),INDEX(scope, path, scope_id)
; kanske andra, men jag behöver seSHOW CREATE TABLE
.- Undvik EAV-schema; det är dåligt för prestandan. Jag lade till en länk; se de många andra diskussionerna. Även:http://mysql.rjweb.org/doc.php/eav
och http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_postmeta
Dessa föremål är förmodligen viktigare (för prestanda) än att kombinera påståendena. Se https://meta.stackexchange.com/questions/ 66377/what-is-the-xy-problem