Tôi đã cố gắng giải quyết vấn đề sau khoảng một giờ và vẫn không giải quyết được gì thêm.
Được rồi, tôi có một bảng (MyISAM):
+---------+-------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| http | smallint(3) | YES | MUL | 200 | |
| elapsed | float(6,3) | NO | | NULL | |
| cached | tinyint(1) | YES | | NULL | |
| ip | int(11) | NO | | NULL | |
| date | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
+---------+-------------+------+-----+-------------------+----------------+
Xin đừng bận tâm đến các chỉ số, tôi đã chơi xung quanh để cố gắng tìm một giải pháp. Bây giờ, đây là truy vấn của tôi.
SELECT http,
COUNT( http ) AS count
FROM reqs
WHERE DATE(date) >= cast(date_sub(date(NOW()),interval 24 hour) as datetime)
GROUP BY http
ORDER BY count;
bảng đang lưu trữ thông tin về các yêu cầu web đến vì vậy nó là một cơ sở dữ liệu khá lớn.
+-----------+
| count(id) |
+-----------+
| 782412 |
+-----------+
lưu ý rằng không có cách nào tốt hơn để đặt khóa chính vì cột id sẽ là định danh duy nhất tôi có. Truy vấn được đề cập ở trên mất khoảng 0,6-1,6 giây để chạy.
Chỉ số nào sẽ thông minh? Tôi hình dung rằng ngày lập chỉ mục sẽ mang lại cho tôi tính chính xác "xấu" và do đó MySQL sẽ không sử dụng nó. http cũng là một lựa chọn tồi vì chỉ có khoảng 20 giá trị khác nhau có thể.
Cảm ơn sự giúp đỡ của bạn!
Cập nhật 1 Tôi đã thêm một chỉ mục vào (http, ngày) như ypercube đề xuất:
mysql> CREATE INDEX httpDate ON reqs (http, date);
và sử dụng truy vấn của mình, nhưng nó thực hiện không kém. Chỉ số được thêm vào:
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| reqs | 0 | PRIMARY | 1 | id | A | 798869 | NULL | NULL | | BTREE | |
| reqs | 1 | httpDate | 1 | http | A | 19 | NULL | NULL | YES | BTREE | |
| reqs | 1 | httpDate | 2 | date | A | 99858 | NULL | NULL | | BTREE | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
và GIẢI THÍCH
+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+
| 1 | PRIMARY | r | range | NULL | httpDate | 3 | NULL | 20 | Using index for group-by; Using temporary; Using filesort |
| 2 | DEPENDENT SUBQUERY | ri | ref | httpDate | httpDate | 3 | func | 41768 | Using where; Using index |
+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+
Phiên bản máy chủ MySQL:
mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+---------------------+
| Variable_name | Value |
+-------------------------+---------------------+
| protocol_version | 10 |
| version | 5.1.73 |
| version_comment | Source distribution |
| version_compile_machine | x86_64 |
| version_compile_os | redhat-linux-gnu |
+-------------------------+---------------------+
5 rows in set (0.00 sec)
http
cột là nullable. Tôi sẽ điều tra vào ngày mai, nếu tôi tìm thấy thời gian.
http NOT NULL
) và sao chép tất cả dữ liệu vào bảng đó (ngoại trừ các hàng có http NULL tất nhiên.)