2011-12-12 31 views
7

Tôi đã có một truy vấn:Mysql giới hạn trên cho count (*)

select count(*) from `table` where `something`>123 

Nếu bảng có vài triệu hồ sơ, truy vấn chạy rất chậm mặc dù có một chỉ mục trên cột something. Tuy nhiên, trên thực tế, tôi quan tâm đến giá trị của:

min(100000, count(*)) 

Vì vậy, có cách nào để ngăn không cho MySQL đếm hàng khi đã tìm thấy 100k không? Tôi đã tìm thấy một cái gì đó như:

select count(*) from (select 1 from `table` where `something`>123 limit 100000) as `asd` 

Đó là nhanh hơn nhiều so count(*) nếu bảng có một vài triệu mục tương ứng, nhưng count(*) chạy nhanh hơn nhiều khi có ít hơn 100000 trận đấu.

Có cách nào để thực hiện nhanh hơn không?

+0

tôi sẽ giả định đó là một typo rằng một giới hạn là '123' và thứ hai là' 23'. – Kevin

+0

Đó là. Cố định, cảm ơn. –

+1

Loại cột nào là 'cái gì đó'? Bạn đang sử dụng InnoDB? –

Trả lời

0

Có thể giúp sử dụng tốt hơn giới hạn phạm vi giá trị.

select count(*) - (select count(*) from t where something <= 123) as cnt 
from t 

Điều khác có thể là có tính năng kích hoạt cập nhật.

1

Tôi không có điểm để bình luận, vì vậy tôi gửi bài này như một câu trả lời ...

  1. bạn đã thử sử dụng EXPLAIN để xem chỉ số của bạn trên something là thực sự được sử dụng? Có vẻ như truy vấn này đang thực hiện một Table Scan. Lý tưởng nhất, bạn sẽ muốn thấy một cái gì đó như "Extra: Sử dụng ở đâu; Sử dụng chỉ mục".
  2. Ngoài sự tò mò, có phải là something trường không có giá trị không?

Là một sang một bên, có lẽ tôi ưu truy vấn sẽ làm tốt hơn với những điều sau đây:

select count(*) as cnt 
from table 
where something > 123 
having count(*) > 100000 
Các vấn đề liên quan