cấu trúc bảng:MySQL chỉ số datetime không hoạt động
+-------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| total | int(11) | YES | | NULL | |
| thedatetime | datetime | YES | MUL | NULL | |
+-------------+----------+------+-----+---------+----------------+
Tổng số hàng:
mysql> explain select * from out where thedatetime <= NOW();
+----+-------------+-------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | out | ALL | thedatetime | NULL | NULL | NULL | 137967 | Using where |
+----+-------------+-------------+------+---------------+------+---------+------+--------+-------------+
Truy vấn thực sự là nhiều hơn nữa còn với bảng hơn tham gia, điểm mấu chốt là, tôi có thể không nhận được bảng để sử dụng chỉ mục datetime
. Điều này sẽ khó khăn cho tôi nếu tôi muốn chọn tất cả dữ liệu cho đến ngày nhất định. Tuy nhiên, tôi nhận thấy rằng tôi có thể nhận được MySQL để sử dụng chỉ mục nếu tôi chọn một tập con nhỏ hơn của dữ liệu.
mysql> explain select * from out where thedatetime <= '2008-01-01';
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+-------------+
| 1 | SIMPLE | out | range | thedatetime | thedatetime | 9 | NULL | 15826 | Using where |
+----+-------------+-------------+-------+---------------+-------------+---------+------+-------+-------------+
mysql> select count(*) from out where thedatetime <= '2008-01-01';
+----------+
| count(*) |
+----------+
| 15990 |
+----------+
Vì vậy, tôi có thể làm gì để đảm bảo rằng MySQL sẽ sử dụng chỉ mục cho dù tôi đặt ngày nào?
Vì 'GIẢI THÍCH' cho bạn biết chỉ mục là 'đã sử dụng', hoặc chính xác hơn, nó được * xem xét * - trong cả hai trường hợp. Câu trả lời của tôi dưới đây giải thích chi tiết. Mặt khác, nếu bạn * đang gặp phải hiệu suất kém thì bạn đã đơn giản hóa câu hỏi quá nhiều. – Unreason