SQL_NO_CACHE не работает

При первом запуске этого sql требуется 39 секунд, когда я снова запускаю и увеличиваю SQL_NO_CACHE, похоже, не вступает в силу:

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)

Я пробовал различные методы, здесь

и даже перезапустить сервер mysql или изменить имя таблицы, но я все еще не могу позволить 39 секунд запустить этот SQL

Я заменил другой SQL и увеличил первый запуск на SQL_NO_CACHE, проблема такая же:

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)

В чем причина? Как я могу получить ту же самую рабочую среду SQL?

Я хочу найти способ оптимизации этого SQL для выполнения 39 секунд

BTW: RESET QUERY CACHE FLUSH QUERY CACHE FLUSH TABLES SET SESSION query_cache_type=off не работает

Тайма состояния mysql закрыта:

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)

объясните этот SQL, использованный составной индекс сайта + endtime (named 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)

Ответ 1

Ответ на вопрос "Как я могу получить ту же самую рабочую среду SQL?" есть - вы не можете. Если ваш запрос читает несколько строк, они кэшируются, в зависимости от используемого механизма хранения, эти строки находятся либо в кеше ОС (myisam), либо в пуле буферов (innodb). Если строки кэшируются, выполнение второго запроса выполняется намного быстрее, потому что MySQL не должен читать с диска.

Ответ 2

В первом запросе следует использовать SQL_NO_CACHE, чтобы сообщить MySQL не помещать результат в кеш. Второй запрос использует кеш и говорит MySQL не кэшировать результат этого запроса, который ничего не делает.

tl; dr - Обратные запросы.

Ответ 3

У меня создалось впечатление, что включение любой функции SQL, которая вычисляется в текущей среде выполнения, не будет кэшировать. Вы пытались сделать что-то вроде следующего?

select count(*), now() from `deal_expired` where `site`=8&&`area`=122 && endtime<1310444996056;

Ответ 4

  • см.: http://forums.mysql.com/read.php?24,225286,225468#msg-225468
  • вы можете попробовать RESET QUERY CACHE (вам нужна привилегия RELOAD), хотя просто прочитав ссылку выше этого, вероятно, не будет работать: (