Teknik 1:Kombination af skalarer:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Hvis a
er noget i stil med COUNT(*)
, så ved du, at der bliver præcis ét resultat; derfor LIMIT 1
er unødvendigt.
Hvis en af disse underforespørgsler måske ikke returnerer nogen rækker, får du NULL
.
Teknik 2:En select kan bruges næsten overalt, hvor et udtryk kan bruges. Ovenstående er teknisk set et eksempel herpå. Også...
SELECT ... WHERE x = ( SELECT ... ) ...
Igen skal underforespørgslen returnere en enkelt række for at gøre det muligt.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Det bliver sådan noget, efter at underforespørgslen er evalueret:
SELECT
WHERE x LIKE '%foo%'
...;
(Det er ikke effektivt, men det virker.)
Disse 3 ligner hinanden, men er ikke nødvendigvis effektive:
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
Dette ligner, men finder de matchende elementer, der mangler fra B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION
skal bruges til forespørgsler, der har lignende output:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
Det vil producere et hvilket som helst antal rækker fra A og et hvilket som helst antal rækker fra B. Dubletter fjernes, hvis du bruger UNION DISTINCT
, eller beholdes, hvis du bruger UNION ALL
.
ORDER BY ... LIMIT ...
bliver tricky. OFFSET
bliver endnu sværere.
Ydeevne
- Undgå
IN ( SELECT ...)
det er normalt den langsommere af de tre. - Undgå at føre jokertegn i
LIKE
; se omFULLTEXT
ville være en bedre mulighed. INDEX(path)
,INDEX(parent_id, child_id)
("covering"),INDEX(scope, path, scope_id)
; måske andre, men jeg har brug for at seSHOW CREATE TABLE
.- Undgå EAV-skema; det er dårligt for ydeevnen. Jeg tilføjede et link; se de mange andre diskussioner. Også:http://mysql.rjweb.org/doc.php/eav og http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_metup_wp /a>
Disse elementer er sandsynligvis vigtigere (for præstationen) end at kombinere udsagnene sammen. Se https://meta.stackexchange.com/questions/ 66377/what-is-the-xy-problem