Nếu bảng của bạn là MyISAM, tôi sẽ bám sát ý tưởng ban đầu của bạn. Lấy số hàng từ bảng MyISAM ngay lập tức. Nó chỉ đọc một giá trị duy nhất vì MyISAM luôn duy trì số lượng hàng.
Với InnoDB, cách làm này vẫn có thể chấp nhận được. Giả sử car_table.id
là khóa chính, SELECT COUNT(id) FROM car_table
chỉ yêu cầu quét chỉ mục, rất nhanh. Bạn có thể cải thiện ý tưởng này bằng cách thêm một cột boolean được lập chỉ mục khác vào bảng của mình:
ALTER car_table ADD COLUMN checked BOOLEAN NOT NULL DEFAULT 0, ADD INDEX (checked);
Giá trị mặc định đảm bảo ô tô mới sẽ được chèn với cờ này được đặt thành 0 mà không cần sửa đổi câu lệnh chèn. Sau đó:
BEGIN TRANSACTION; -- make sure nobody interferes
SELECT COUNT(checked) FROM car_table WHERE checked = FALSE FOR UPDATE; -- this gets you the number of new, unchecked cars
UPDATE car_table SET checked = TRUE WHERE checked = FALSE; -- mark these cars as checked
COMMIT;
Bằng cách này, bạn chỉ quét một số lượng rất nhỏ các mục nhập chỉ mục tại mỗi cuộc thăm dò ý kiến.
Một cách tiếp cận nâng cao hơn bao gồm thêm ID ô tô mới tạo vào một bảng bên, thông qua một trình kích hoạt. Bảng phụ này được quét thường xuyên, không khóa bảng chính và không thay đổi cấu trúc của nó. Chỉ cần TRUNCATE
bảng phụ này sau mỗi cuộc thăm dò ý kiến.
Cuối cùng, có tùy chọn kích hoạt UDF, theo đề xuất của Panagiotis, nhưng điều này dường như là quá mức cần thiết trong hầu hết các tình huống.