Lần đầu tiên tôi chạy sql này, cần 39 giây, khi tôi chạy lại và tăng SQL_NO_CACHE, dường như không có hiệu lực:SQL_NO_CACHE không hoạt động
mysql> select count(*) from `deal_expired` where `site`=8&&`area`=122 &&
endtime<1310444996056;
+----------+
| count(*) |
+----------+
| 497 |
+----------+
1 row in set (39.55 sec)
mysql> select SQL_NO_CACHE count(*) from `deal_expired` where `site`=8&&`area`=
122 && endtime<1310444996056;
+----------+
| count(*) |
+----------+
| 497 |
+----------+
1 row in set (0.16 sec)
Tôi đã thử một loạt các phương pháp, here
và thậm chí khởi động lại máy chủ mysql hoặc thay đổi tên bảng, nhưng tôi vẫn không thể để 39 giây chạy SQL này
tôi thay thế khác SQL, và sự gia tăng trong thời gian đầu tiên trên SQL_NO_CACHE, vấn đề là như nhau:
mysql> select SQL_NO_CACHE count(*) from `deal_expired` where `site`=25&&`area`=
134 && endtime<1310483196227;
+----------+
| count(*) |
+----------+
| 315 |
+----------+
1 row in set (2.17 sec)
mysql> select SQL_NO_CACHE count(*) from `deal_expired` where `site`=25&&`area`=
134 && endtime<1310483196227;
+----------+
| count(*) |
+----------+
| 315 |
+----------+
1 row in set (0.01 sec)
Lý do là gì? Làm cách nào để có được cùng một thời gian chạy SQL?
Tôi muốn tìm một cách để tối ưu hóa SQL này để thực hiện 39 giây
BTW: RESET QUERY CACHE
FLUSH QUERY CACHE
FLUSH TABLES
SET SESSION query_cache_type=off
không hoạt động
bộ nhớ cache bang mysql đã bị đóng cửa:
mysql> SHOW STATUS LIKE "Qcache%";
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+-------------------------+-------+
8 rows in set (0.04 sec)
mysql> select count(*) from `deal_expired` where `site`=25&&`area`=134 && endtime<1310
483196227;
+----------+
| count(*) |
+----------+
| 315 |
+----------+
1 row in set (0.01 sec)
mysql> SHOW STATUS LIKE "Qcache%";
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+-------------------------+-------+
8 rows in set (0.00 sec)
giải thích SQL này, trang web được sử dụng + chỉ mục tổng hợp thời gian kết thúc (có tên site_endtime):
mysql> explain select count(*) from `deal_expired` where `site`=8&&`area`=122 && endti
me<1310444996056;
+--------+------+-------------------------------+--------------+---------+------
-+------+-------------+
| table | type | possible_keys | key | key_len | ref
| rows | Extra |
+--------+------+-------------------------------+--------------+---------+------
-+------+-------------+
| deal_expired | ref | name,url,endtime,site_endtime | site_endtime | 4 | const
| 353 | Using where |
+--------+------+-------------------------------+--------------+---------+------
-+------+-------------+
1 row in set (0.00 sec)
Bạn có sử dụng chỉ mục ** tổng hợp ** cho truy vấn này không? – Karolis
@Karolis có một trang web + endtime (tên là 'site_endtime') chỉ số tổng hợp – Koerr
Tôi không biết gì về cơ sở dữ liệu cụ thể của bạn, nhưng có vẻ như bạn nên tạo một chỉ mục tổng hợp khác (site + area + endtime) . MySql sẽ đọc ít hàng hơn, vì vậy nó sẽ trở nên nhanh hơn. – Karolis