SQL_NO_CACHE не работает - PullRequest
       2

SQL_NO_CACHE не работает

28 голосов
/ 12 июля 2011

При первом запуске этого 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 секунд

Кстати: 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, используемый сайт + составной индекс конечного времени (с именем 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)

Ответы [ 4 ]

40 голосов
/ 18 января 2013

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

tl; dr - отменить ваши запросы.

13 голосов
/ 12 июля 2011

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

7 голосов
/ 29 декабря 2011

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

select count(*), now() from `deal_expired` where `site`=8&&`area`=122 && endtime<1310444996056;
0 голосов
/ 12 июля 2011
  1. см .: http://forums.mysql.com/read.php?24,225286,225468#msg-225468
  2. вы можете попробовать RESET QUERY CACHE (вам нужна привилегия RELOAD), хотя, просто прочитав ссылку выше, это, вероятно, также не будет работать: (
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...