Bir mysql ORDER BY
ile birlikte kullanılan bir alt sorgunun içinde bir yan tümce kullandığınızda, yan UNION
tümceyi optimize eder ORDER BY
.
Bunun nedeni, varsayılan olarak UNION
a'nın sırasız bir liste döndürmesidir, bu nedenle bir ORDER BY
hiçbir şey yapmaz.
Optimizasyon belgelerde belirtilir ve şöyle der:
ORDER BY veya LIMIT'i tek bir SELECT'e uygulamak için, SELECT'i çevreleyen parantezlerin içine tümceyi yerleştirin:
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
Ancak, tek tek SELECT deyimleri için ORDER BY kullanımı, satırların nihai sonuçta görünme sırası hakkında hiçbir şey ifade etmez çünkü UNION varsayılan olarak sırasız bir satır kümesi üretir. Bu nedenle, bu bağlamda ORDER BY kullanımı tipik olarak LIMIT ile bağlantılı olduğundan, SELECT için almak üzere seçilen satırların alt kümesini belirlemek için kullanılır, ancak bu satırların içindeki sırayı etkilemeyebilir. final UNION sonucu. ORDER BY bir SELECT'te LIMIT olmadan görünürse, yine de hiçbir etkisi olmayacağı için optimize edilmiştir.
Bunun son cümlesi biraz yanıltıcı çünkü bir etkisi olmalı. Bu optimizasyon, alt sorgu içinde sipariş vermeniz gereken bir durumdayken soruna neden olur.
MySQL'i bu optimizasyonu yapmamaya zorlamak için aşağıdaki gibi bir LIMIT cümlesi ekleyebilirsiniz:
(SELECT 1 AS rank, id, add_date FROM my_table WHERE distance < 5 ORDER BY add_date LIMIT 9999999999)
UNION ALL
(SELECT 2 AS rank, id, add_date FROM my_table WHERE distance BETWEEN 5 AND 15 ORDER BY rank LIMIT 9999999999)
UNION ALL
(SELECT 3 AS rank, id, add_date from my_table WHERE distance BETWEEN 5 and 15 ORDER BY id LIMIT 9999999999)
Yüksek , sayfalandırma gibi bir şey yapmak istiyorsanız genel sorguya LIMIT
bir ekleyebileceğiniz anlamına gelir OFFSET
.
Bu aynı zamanda size ORDER BY
her bir birleşim için farklı sütunlar oluşturabilme avantajını da sağlar .