Teknik 1:Menggabungkan skalar:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Jika a
adalah sesuatu seperti COUNT(*)
, maka Anda tahu bahwa akan ada tepat satu hasil; maka LIMIT 1
tidak perlu.
Jika salah satu dari subkueri tersebut mungkin tidak mengembalikan baris apa pun, maka Anda mendapatkan NULL
.
Teknik 2:Pilihan dapat digunakan hampir di mana saja ekspresi dapat digunakan. Di atas, secara teknis, adalah contohnya. Juga...
SELECT ... WHERE x = ( SELECT ... ) ...
Sekali lagi, subquery harus mengembalikan satu baris untuk memungkinkannya.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Itu menjadi seperti ini setelah subquery dievaluasi:
SELECT
WHERE x LIKE '%foo%'
...;
(Ini tidak efisien, tetapi berhasil.)
Ketiganya serupa, tetapi tidak selalu efisien satu sama lain:
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
Ini serupa tetapi menemukan item yang cocok yang hilang dari B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION
harus digunakan untuk kueri yang memiliki keluaran serupa:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
Itu akan menghasilkan sejumlah baris dari A dan sejumlah baris dari B. Duplikat dihapus jika Anda menggunakan UNION DISTINCT
, atau disimpan jika Anda menggunakan UNION ALL
.
ORDER BY ... LIMIT ...
menjadi rumit. OFFSET
menjadi lebih rumit.
Kinerja
- Hindari
IN ( SELECT ...)
biasanya lebih lambat dari ketiganya. - Hindari karakter pengganti utama di
LIKE
; lihat apakahFULLTEXT
akan menjadi pilihan yang lebih baik. INDEX(path)
,INDEX(parent_id, child_id)
("meliputi"),INDEX(scope, path, scope_id)
; mungkin yang lain, tapi saya perlu melihatSHOW CREATE TABLE
.- Hindari skema EAV; itu buruk untuk kinerja. Saya menambahkan tautan; lihat banyak diskusi lainnya. Juga:http://mysql.rjweb.org/doc.php/eav dan http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding_up_wp_postmeta
Barang-barang itu mungkin lebih penting (untuk kinerja) daripada menggabungkan pernyataan bersama-sama. Lihat https://meta.stackexchange.com/questions/ 66377/masalah-xy-apa