2010-04-08 29 views
5

Tôi có một bảng lớn và tôi muốn phân loại đơn giản.Phân loại MySQL: NULL đến chỉ mục kết thúc & sử dụng? Không thể?

Có thể dễ dàng như vậy. Tôi chỉ có thể tạo chỉ mục và thực hiện phân loại nhanh chóng nhờ vào chỉ mục đó.

Nhưng khách hàng của tôi muốn đặt NULL vào cuối, điều này làm phức tạp toàn bộ tình huống.

Thay vì đơn giản: SORT BY name ASC Tôi phải làm SORT BY name IS NULL ASC, name ASC. Điều đó sẽ ổn thôi, nhưng bởi vì chỉ số của tôi là vô ích, và việc phân loại rất chậm.

Tôi không biết nếu có cách nào giải quyết vấn đề này, nhưng nếu có, tôi tuyệt vọng yêu cầu giúp đỡ. : '(

Trả lời

5

UNION ALL không được đảm bảo giữ gìn trật tự kỷ lục, nhưng với thực hiện trận chung kết ORDER BY sẽ lên chỉ. để một pass duy nhất trên các lĩnh vực đã ra lệnh:.

SELECT * 
FROM (
     SELECT 1 AS source, * 
     FROM user 
     WHERE name IS NOT NULL 
     ORDER BY 
       name 
     ) 
UNION ALL 
SELECT 2 AS source, * 
FROM user 
WHERE name IS NULL 
ORDER BY 
     source, name 

Bỏ trận chung kết ORDER BY có thể phá vỡ ứng dụng của bạn trong tương lai

Đây là pro bably một trong những trường hợp hiếm hoi khi nó tốt hơn để chia truy vấn trong hai ở phía khách hàng.

+0

Ok, chỉ là một câu hỏi. Điều này có an toàn khi bạn có bản ghi 1 triệu không? Bởi vì tôi đã thử nó với các bản ghi 1 triệu và tôi luôn phải hủy truy vấn, không bao giờ đạt được kết quả. Có thể truy vấn đầu tiên tải quá nhiều không, tôi có nên vượt qua một số LIMITE không? – Vojto

+0

@Vojto: MySQL lưu trữ kết quả của lượt xem nội bộ. Bạn tốt hơn sử dụng hai truy vấn ở phía khách hàng. BTW, bạn có thực sự cần lấy tất cả các bản ghi '1M' không? – Quassnoi

+0

Vâng, tôi đặt giới hạn ở cuối toàn bộ truy vấn, nhưng khi tôi không đặt giới hạn cho các truy vấn phụ đó, nó rất chậm. – Vojto

0

Sử dụng một union lần đầu tiên chọn các hồ sơ trong đó name là không null, và sau đó là phần còn lại

+0

Cảm ơn, điều đó có ý nghĩa, tôi sẽ thử! – Vojto

Các vấn đề liên quan