2013-11-15 23 views
8

Tôi chỉ muốn biết cái nào là nhanh nhất.giới hạn so với số tồn tại so với (*) so với số (id) trong MySQL

Điều tôi đang cố làm là chỉ kiểm tra xem dữ liệu có tồn tại trên bảng hay không. Tôi đã sử dụng "LIMIT" phần lớn thời gian nhưng theo ý kiến ​​của bạn hoặc nếu bạn có cơ sở, cái nào là nhanh nhất để kiểm tra xem dữ liệu có tồn tại hay không.

Ví dụ:

giới hạn 1:

SELECT ID 
     FROM TABLE 
     WHERE ID=1 LIMIT 1; 

tồn tại:

SELECT EXISTS(
       SELECT * 
       FROM TABLE 
       WHERE ID=1); 

count (*):

SELECT (*) 
FROM TABLE; 

count (ID):

SELECT (ID) 
FROM TABLE;" 

bổ sung: Tôi đang sử dụng InnoDB.

+0

'SELECT 1 TỪ

LIMIT 1'? –

+0

SELECT ID FROM TABLE LIMIT 1 - TABLE là tên bảng.: D – Echusen

Trả lời

13

Giới hạn luôn là nhanh nhất vì nó lặp lại một dòng của bảng.

Hiện tại có rất ít sự khác biệt với Giới hạn bởi vì bạn chỉ cần thêm một câu lệnh chọn khác, chúng tôi có thể nói nó có hiệu quả giống như câu lệnh đầu tiên.

Đếm sẽ lặp lại tất cả bảng và đếm kết quả. Khi bạn sử dụng số (), theo mặc định, mysql đếm khóa chính của bảng. Tôi đã thực hiện một số thử nghiệm đếm (id), đếm (), đếm (trường) và đếm (1) trong bảng lớn, không có sự khác biệt lớn. Theo tôi, 'đếm' sẽ luôn cố gắng đếm chỉ số trừ khi trường bạn đếm không phải là chỉ mục, nhưng nhiều người nói rằng chúng ta nên sử dụng số (id) thay vì sử dụng số đếm (*).

Trong một bảng nhỏ, bốn cách đều hoạt động tốt. Nhưng nếu bạn tham gia với một số bàn lớn, đếm sẽ mất một thời gian rất dài.

Vì vậy, trong tất cả, thời gian sử dụng là count (*)> count (id) >> tồn tại> giới hạn

+0

lời giải thích tốt đẹp 'bro ..: D, tôi khách, tôi sẽ dính vào LIMIT – Echusen

0

Tôi nghĩ rằng tất cả đều ổn; ngoại trừ tôi sẽ xóa các điều khoản WHERE ID = 1. Nếu bạn đã từng xóa bảng và bắt đầu chèn lại thì ID 1 sẽ không tồn tại. Chỉ cần LIMIT 1 sẽ thực hiện thủ thuật. Cá nhân tôi không ủng hộ các tùy chọn existscount(*). Tôi thích count(ID) sau đó, như bạn thường sẽ có một chỉ số trên ID vì vậy tôi mong đợi rằng để chạy khá nhanh chóng. Để chắc chắn, bạn sẽ phải dành thời gian cho chúng (trên một bàn rất lớn) - Tôi mong đợi chúng xuất hiện một cái gì đó như exists, limit 1, count(id), count(*) từ nhanh nhất đến chậm nhất. (Tôi nghi ngờ về các exists mặc dù - nếu nó thực sự đánh giá toàn bộ SELECT * nó có thể đi ra tồi tệ nhất).

+0

Tôi nghĩ rằng TS muốn kiểm tra xem một hàng cụ thể có tồn tại trong bảng hay không, nếu không tồn tại hàng, và tôi giả sử '1' chỉ là một ví dụ – Martijn

+0

Trong trường hợp đó không phải tất cả bốn câu lệnh mà ông cung cấp đều tương đương, nên làm rõ! – CompuChip

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