Giải pháp: Toán tử modulo (%)
ID % 4 = 0 kiểm tra ID chia hết cho 4.
Ví dụ minh họa
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (ID INT, StudentName VARCHAR(10), CountryName VARCHAR(20)); mysql> INSERT INTO DemoTable VALUES(0, 'David', 'AUS'), (3, 'Chris', 'UK'), (8, 'Carol', 'US'), (9, 'Sam', 'US'), (12, 'Robert', 'UK'), (10, 'Mike', 'AUS');
Dữ liệu gốc
+------+-------------+-------------+ | ID | StudentName | CountryName | +------+-------------+-------------+ | 0 | David | AUS | | 3 | Chris | UK | | 8 | Carol | US | | 9 | Sam | US | | 12 | Robert | UK | | 10 | Mike | AUS | +------+-------------+-------------+
Truy vấn chia hết cho 4
mysql> SELECT * FROM DemoTable WHERE (ID % 4) = 0;
Kết quả
+------+-------------+-------------+ | ID | StudentName | CountryName | +------+-------------+-------------+ | 0 | David | AUS | | 8 | Carol | US | | 12 | Robert | UK | +------+-------------+-------------+
Giải thích
%là toán tử modulo (phần dư chia)ID % 4 = 0⇔ ID là bội số của 4: 0, 4, 8, 12, 16...0 % 4 = 0→ 0 cũng được chọn (0 chia hết cho mọi số ≠ 0)
Mở rộng: Các pattern modulo
| Điều kiện | Ý nghĩa | Ví dụ ID |
|---|---|---|
ID % 2 = 0 | Số chẵn | 0, 2, 4, 6, 8... |
ID % 2 = 1 | Số lẻ | 1, 3, 5, 7, 9... |
ID % 3 = 0 | Chia hết cho 3 | 0, 3, 6, 9, 12... |
ID % 4 = 1 | Dư 1 khi chia 4 | 1, 5, 9, 13... |
ID % 10 = 0 | Kết thúc bằng 0 | 10, 20, 30... |
Ứng dụng thực tế
Phân chia dữ liệu (Sharding)
-- 4 shards dựa trên ID WHERE ID % 4 = 0 -- Shard 0 WHERE ID % 4 = 1 -- Shard 1 WHERE ID % 4 = 2 -- Shard 2 WHERE ID % 4 = 3 -- Shard 3
Lấy mẫu ngẫu nhiên (Bernoulli sampling)
-- ~25% dữ liệu WHERE RAND() < 0.25 -- Hoặc deterministic WHERE ID % 100 < 25
Round-robin assignment
-- Gán task cho 4 worker WHERE worker_id = (task_id % 4)
Lưu ý hiệu năng
- Modulo trên cột index: Không dùng được index (function trên cột)
- Bảng lớn: Cân nhắc cột computed
shard_id INT AS (ID % 4) STORED+ index - Hoặc dùng range:
WHERE ID BETWEEN 0 AND 1000000cho shard 0