2013-08-18 22 views
6

Tôi có bảng nhưindex MySQL trên cột timestamp không được sử dụng cho ngày lớn dao động

+-------------------+----------------+------+-----+---------------------+-----------------------------+ 
| Field    | Type   | Null | Key | Default    | Extra      | 
+-------------------+----------------+------+-----+---------------------+-----------------------------+ 
| id    | bigint(20)  | NO | PRI | NULL    | auto_increment    | 
| runtime_id  | bigint(20)  | NO | MUL | NULL    |        | 
| place_id   | bigint(20)  | NO | MUL | NULL    |        | 
| amended_timestamp | varchar(50) | YES |  | NULL    |        | 
| applicable_at  | timestamp  | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
| schedule_time  | timestamp  | NO | MUL | 0000-00-00 00:00:00 |        | 
| quality_indicator | varchar(10) | NO |  | NULL    |        | 
| flow_rate   | decimal(15,10) | NO |  | NULL    |        | 
+-------------------+----------------+------+-----+---------------------+-----------------------------+ 

Tôi có chỉ mục trên schedule_time như

create index table_index on table(schedule_time asc); 

Bảng hiện có 2121552+ hồ sơ.

Điều tôi không hiểu là khi tôi làm giải thích

explain select runtime_id from table where schedule_time >= now() - INTERVAL 1 DAY; 
+----+-------------+----------+-------+------------------------------+------------------------------+---------+------+-------+-------------+ 
| id | select_type | table | type | possible_keys    | key       | key_len | ref | rows | Extra  | 
+----+-------------+----------+-------+------------------------------+------------------------------+---------+------+-------+-------------+ 
| 1 | SIMPLE  | table | range | table_index     | table_index     | 4  | NULL | 38088 | Using where | 
+----+-------------+----------+-------+------------------------------+------------------------------+---------+------+-------+-------------+ 
1 row in set (0.00 sec) 

Trên chỉ số được sử dụng, nhưng bên dưới người ta không.

mysql> explain select runtime_id from table where schedule_time >= now() - INTERVAL 30 DAY; 
+----+-------------+----------+------+------------------------------+------+---------+------+---------+-------------+ 
| id | select_type | table | type | possible_keys    | key | key_len | ref | rows | Extra  | 
+----+-------------+----------+------+------------------------------+------+---------+------+---------+-------------+ 
| 1 | SIMPLE  | table | ALL | table_index     | NULL | NULL | NULL | 2118107 | Using where | 
+----+-------------+----------+------+------------------------------+------+---------+------+---------+-------------+ 
1 row in set (0.00 sec) 

Tôi thực sự đánh giá cao nếu ai đó có thể chỉ ra điều gì sai ở đây, vì dữ liệu được cập nhật sau 12 phút và thời gian trôi qua truy vấn trong 30 ngày hoặc có thể là 60 ngày.

Truy vấn cuối cùng, nơi tôi có kế hoạch để sử dụng nó như sau

select avg(flow_rate),c.group from table a ,(select runtime_id from table where schedule_time >= now() - INTERVAL 1 DAY group by schedule_time) b,place c where a.runtime_id = b.runtime_id and a.place_id = c.id group by c.group; 

Cập nhật =====>

Theo ý kiến ​​giữa thất bại quá.

mysql> explain select runtime_id from table where schedule_time between '2013-07-17 12:48:00' and '2013-08-17 12:48:00'; 
+----+-------------+----------+------+------------------------------+------+---------+------+---------+-------------+ 
| id | select_type | table | type | possible_keys    | key | key_len | ref | rows | Extra  | 
+----+-------------+----------+------+------------------------------+------+---------+------+---------+-------------+ 
| 1 | SIMPLE  | table | ALL | table_index     | NULL | NULL | NULL | 2118431 | Using where | 
+----+-------------+----------+------+------------------------------+------+---------+------+---------+-------------+ 
1 row in set (0.00 sec) 

mysql> explain select runtime_id from table where schedule_time between '2013-08-16 12:48:00' and '2013-08-17 12:48:00'; 
+----+-------------+----------+-------+------------------------------+------------------------------+---------+------+-------+-------------+ 
| id | select_type | table | type | possible_keys    | key       | key_len | ref | rows | Extra  | 
+----+-------------+----------+-------+------------------------------+------------------------------+---------+------+-------+-------------+ 
| 1 | SIMPLE  | table | range | table_index     | table_index     | 4  | NULL | 38770 | Using where | 
+----+-------------+----------+-------+------------------------------+------------------------------+---------+------+-------+-------------+ 
1 row in set (0.00 sec) 

Cập nhật 2 =======>

mysql> select count(*) from table where schedule_time between '2013-08-16 12:48:00' and '2013-08-17 12:48:00'; 
+----------+ 
| count(*) | 
+----------+ 
| 19440 | 
+----------+ 
1 row in set (0.01 sec) 

mysql> select count(*) from table where schedule_time between '2013-07-17 12:48:00' and '2013-08-17 12:48:00'; 
+----------+ 
| count(*) | 
+----------+ 
| 597132 | 
+----------+ 
1 row in set (0.00 sec) 

Server phiên bản: 5.5.24-0ubuntu0.12.04.1 (Ubuntu)

+0

Câu hỏi tương tự ở đây - ý tưởng là sử dụng câu lệnh 'between': http://stackoverflow.com/questions/2041575/mysql-query-records-between-today-and-last-30-days – FreudianSlip

+1

Tôi đã được không thể tái tạo hành vi đó (không cố gắng hết sức, suy nghĩ ...) Chỉ cần một phỏng đoán hoang dã: chạy 'ANALYZE TABLE my_table' cải thiện mọi thứ? –

+0

@SylvainLeroux Tôi chạy BẢNG ANALYZE nhưng kết quả tương tự với cả giữa và Khoảng thời gian –

Trả lời

3

Các ưu MySQL cố gắng làm điều nhanh nhất - nơi mà nó nghĩ rằng việc sử dụng chỉ mục sẽ mất nhiều thời gian hơn hoặc lâu hơn so với thực hiện quét bảng, nó từ bỏ chỉ mục có sẵn. Đây là những gì bạn thấy nó làm trong ví dụ của bạn: nơi phạm vi nhỏ (1 ngày) chỉ số sẽ nhanh hơn; nơi mà phạm vi lớn, bạn sẽ đánh nhiều hơn nữa bảng, bạn cũng có thể quét trực tiếp bảng (hãy nhớ, sử dụng chỉ mục liên quan đến việc tìm kiếm chỉ mục và sau đó lấy các bản ghi được lập chỉ mục từ bảng - hai bộ tìm kiếm).

Nếu bạn nghĩ rằng bạn biết rõ hơn trình tối ưu hóa (nó không hoàn hảo), hãy sử dụng gợi ý (http://dev.mysql.com/doc/refman/5.5/en/index-hints.html).

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