Kỹ thuật 1:Kết hợp các đại lượng vô hướng:
SELECT a ... LIMIT 1;
SELECT b ... LIMIT 1;
-->
SELECT
( SELECT a ... LIMIT 1) AS a,
( SELECT b ... LIMIT 1) AS b ;
Nếu a
là một cái gì đó giống như COUNT(*)
, thì bạn biết rằng sẽ có chính xác một kết quả; do đó LIMIT 1
là không cần thiết.
Nếu một trong các truy vấn con đó có thể không trả về bất kỳ hàng nào, thì bạn nhận được NULL
.
Kỹ thuật 2:Một vùng chọn có thể được sử dụng ở hầu hết mọi nơi mà một biểu thức có thể được sử dụng. Ở trên, về mặt kỹ thuật, là một ví dụ về điều đó. Ngoài ra ...
SELECT ... WHERE x = ( SELECT ... ) ...
Một lần nữa, truy vấn con phải trả về một hàng để có thể thực hiện điều đó.
SELECT ...
WHERE x LIKE CONCAT('%', ( SELECT ... ), '%')
...;
Điều đó sẽ trở thành một cái gì đó như thế này sau khi truy vấn con được đánh giá:
SELECT
WHERE x LIKE '%foo%'
...;
(Nó không hiệu quả, nhưng nó hoạt động.)
3 điều này tương tự nhau, nhưng không nhất thiết phải hiệu quả như nhau:
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
Điều này tương tự nhưng tìm thấy các mục phù hợp bị thiếu từ B:
SELECT ... FROM A LEFT JOIN B ON B.x = A.x
WHERE B.id IS NULL
UNION
nên được sử dụng cho các truy vấn có đầu ra tương tự:
SELECT x,y FROM A
UNION
SELECT x,y FROM B
Điều đó sẽ tạo ra bất kỳ số lượng hàng nào từ A và bất kỳ số hàng nào từ B. Các bản sao sẽ bị xóa nếu bạn sử dụng UNION DISTINCT
hoặc được giữ lại nếu bạn sử dụng UNION ALL
.
ORDER BY ... LIMIT ...
khó khăn. OFFSET
thậm chí còn phức tạp hơn.
Hiệu suất
- Tránh
IN ( SELECT ...)
nó thường chậm hơn trong ba cái. - Tránh các ký tự đại diện đứng đầu trong
LIKE
; xem nếuFULLTEXT
sẽ là một lựa chọn tốt hơn. -
INDEX(path)
,INDEX(parent_id, child_id)
("cover"),INDEX(scope, path, scope_id)
; có thể khác, nhưng tôi cần xemSHOW CREATE TABLE
. - Tránh lược đồ EAV; nó không tốt cho hiệu suất. Tôi đã thêm một liên kết; xem nhiều cuộc thảo luận khác. Ngoài ra: http://mysql.rjweb.org/doc.php/eav và http://mysql.rjweb.org/doc.php/index_cookbook_mysql#speeding / a>
Những mặt hàng đó có lẽ là quan trọng hơn (đối với hiệu suất) hơn là kết hợp các câu lệnh với nhau. Xem https://meta.stackexchange.com/questions/ 66377 / what-is-the-xy-problem