Technika 1:Kombinace skalárů:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Pokud a
je něco jako COUNT(*)
, pak víte, že bude přesně jeden výsledek; proto LIMIT 1
je zbytečné.
Pokud jeden z těchto poddotazů nemusí vrátit žádné řádky, dostanete NULL
.
Technika 2:Select lze použít téměř všude, kde lze použít výraz. Výše uvedené je technicky příkladem takového. Také...
SELECT ... WHERE x = ( SELECT ... ) ...
Aby to bylo možné, musí poddotaz opět vrátit jeden řádek.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Po vyhodnocení dílčího dotazu to bude něco podobného:
SELECT
WHERE x LIKE '%foo%'
...;
(Není to efektivní, ale funguje to.)
Tyto 3 jsou podobné, ale ne nutně účinné:
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
Toto je podobné, ale najde odpovídající položky, které chybějí od B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION
by měl být použit pro dotazy, které mají podobný výstup:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
To vytvoří libovolný počet řádků z A a libovolný počet řádků z B. Pokud použijete UNION DISTINCT
, budou duplikáty odstraněny. , nebo ponecháno, pokud používáte UNION ALL
.
ORDER BY ... LIMIT ...
se stává záludným. OFFSET
je ještě složitější.
Výkon
- Vyhněte se
IN ( SELECT ...)
obvykle je to pomalejší ze tří. - V
LIKE
se vyvarujte zástupných znaků na začátku; podívejte se, zdaFULLTEXT
by byla lepší volba. INDEX(path)
,INDEX(parent_id, child_id)
("pokrytí"),INDEX(scope, path, scope_id)
; možná ostatní, ale musím vidětSHOW CREATE TABLE
.- Vyhněte se schématu EAV; je to špatné pro výkon. Přidal jsem odkaz; viz mnoho dalších diskuzí. Také:http://mysql.rjweb.org/doc.php/eav a http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_ /a>
Tyto položky jsou pravděpodobně důležitější (pro výkon) než kombinace prohlášení dohromady. Viz https://meta.stackexchange.com/questions/ 66377/co-je-xy-problém