Tecnica 1:Combinazione di scalari:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Se a
è qualcosa come COUNT(*)
, allora sai che ci sarà esattamente un risultato; da qui il LIMIT 1
non è necessario.
Se una di queste sottoquery potrebbe non restituire alcuna riga, ottieni NULL
.
Tecnica 2:una selezione può essere utilizzata quasi ovunque sia possibile utilizzare un'espressione. Quanto sopra è, tecnicamente, un esempio di tale. Inoltre...
SELECT ... WHERE x = ( SELECT ... ) ...
Anche in questo caso, la sottoquery deve restituire una singola riga per renderlo possibile.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Diventa qualcosa del genere dopo che la sottoquery è stata valutata:
SELECT
WHERE x LIKE '%foo%'
...;
(Non è efficiente, ma funziona.)
Questi 3 sono simili, ma non necessariamente efficienti l'uno con l'altro:
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
Questo è simile ma trova gli elementi corrispondenti che sono mancanti da B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION
dovrebbe essere utilizzato per query con output simile:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
Ciò produrrà un numero qualsiasi di righe da A e un numero qualsiasi di righe da B. I duplicati vengono rimossi se usi UNION DISTINCT
o conservato se utilizzi UNION ALL
.
ORDER BY ... LIMIT ...
diventa complicato. OFFSET
diventa ancora più complicato.
Prestazioni
- Evita
IN ( SELECT ...)
di solito è il più lento dei tre. - Evita i caratteri jolly iniziali in
LIKE
; vedi seFULLTEXT
sarebbe un'opzione migliore. INDEX(path)
,INDEX(parent_id, child_id)
("copertura"),INDEX(scope, path, scope_id)
; forse altri, ma ho bisogno di vedereSHOW CREATE TABLE
.- Evita lo schema EAV; è male per le prestazioni. Ho aggiunto un collegamento; vedi le tante altre discussioni. Inoltre:http://mysql.rjweb.org/doc.php/eav e http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
Questi elementi sono probabilmente più importante (per la performance) che combinare le affermazioni insieme. Vedi https://meta.stackexchange.com/questions/ 66377/qual-è-il-problema-xy