Техника 1:Комбиниране на скалари:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Ако a
е нещо като COUNT(*)
, тогава знаете, че ще има точно един резултат; следователно LIMIT 1
е ненужен.
Ако една от тези подзаявки може да не върне никакви редове, тогава получавате NULL
.
Техника 2:Select може да се използва почти навсякъде, където може да се използва израз. Горното е технически пример за такъв. Освен това...
SELECT ... WHERE x = ( SELECT ... ) ...
Отново подзаявката трябва да върне един ред, за да стане това възможно.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Това става нещо подобно, след като подзаявката бъде оценена:
SELECT
WHERE x LIKE '%foo%'
...;
(Не е ефективно, но работи.)
Тези 3 са сходни, но не непременно ефективни един от друг:
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
Това е подобно, но намира съответстващите елементи, които липсват от B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION
трябва да се използва за заявки, които имат подобен резултат:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
Това ще произведе произволен брой редове от A и произволен брой редове от B. Дубликатите се премахват, ако използвате UNION DISTINCT
, или се запазва, ако използвате UNION ALL
.
ORDER BY ... LIMIT ...
става трудно. OFFSET
става още по-сложно.
Ефективност
- Избягвайте
IN ( SELECT ...)
обикновено е по-бавният от трите. - Избягвайте водещи заместващи знаци в
LIKE
; вижте далиFULLTEXT
би било по-добър вариант. INDEX(path)
,INDEX(parent_id, child_id)
("покриване"),INDEX(scope, path, scope_id)
; може би други, но трябва да видяSHOW CREATE TABLE
.- Избягвайте EAV схема; това е лошо за производителността. Добавих линк; вижте много други дискусии. Също така:http://mysql.rjweb.org/doc.php/eav и http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
Тези елементи са вероятно по-важно (за производителността) от комбинирането на изявленията заедно. Вижте https://meta.stackexchange.com/questions/ 66377/what-is-the-xy-problem