Techniek 1:Combineren van scalairen:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Als a
is zoiets als COUNT(*)
, dan weet je dat er precies één resultaat zal zijn; vandaar de LIMIT 1
is niet nodig.
Als een van die subquery's mogelijk geen rijen retourneert, krijgt u NULL
.
Techniek 2:Een select kan bijna overal worden gebruikt waar een uitdrukking kan worden gebruikt. Het bovenstaande is, technisch gezien, daar een voorbeeld van. Ook...
SELECT ... WHERE x = ( SELECT ... ) ...
Nogmaals, de subquery moet een enkele rij retourneren om dat mogelijk te maken.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Dat wordt ongeveer dit nadat de subquery is geëvalueerd:
SELECT
WHERE x LIKE '%foo%'
...;
(Het is niet efficiënt, maar het werkt.)
Deze 3 zijn vergelijkbaar, maar niet noodzakelijk efficiënt als elkaar:
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
Dit is vergelijkbaar, maar vindt de overeenkomende items die ontbrekende van B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION
moet worden gebruikt voor zoekopdrachten met vergelijkbare uitvoer:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
Dat levert een willekeurig aantal rijen van A en een willekeurig aantal rijen van B op. Duplicaten worden verwijderd als u UNION DISTINCT
gebruikt , of bewaard als u UNION ALL
. gebruikt .
ORDER BY ... LIMIT ...
wordt lastig. OFFSET
wordt nog lastiger.
Prestaties
- Vermijd
IN ( SELECT ...)
het is meestal de langzamere van de drie. - Vermijd voorloopwildcards in
LIKE
; kijk ofFULLTEXT
zou een betere optie zijn. INDEX(path)
,INDEX(parent_id, child_id)
("covering"),INDEX(scope, path, scope_id)
; misschien anderen, maar ik moetSHOW CREATE TABLE
. zien .- Vermijd EAV-schema; het is slecht voor de prestaties. Ik heb een link toegevoegd; zie de vele andere discussies. Ook:http://mysql.rjweb.org/doc.php/eav
en http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
Die items zijn waarschijnlijk belangrijker (voor de prestatie) dan het samenvoegen van de uitspraken. Zie https://meta.stackexchange.com/questions/ 66377/wat-is-het-xy-probleem