SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.04.2010 14:48:24

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

кеширование результата запроса, который долго выполняется

Доброго времени суток!

Ситуация следующая: есть select, который очень долго отрабатывается (много данных в таблице и пробежаться нужно по всем ним), результат этого select'a требуется в нескольких местах. Хотелось бы его закешировать (чтобы из другой sql-сессии сделать такой запрос и получить закешированный результат), но не кешируется sad.

Выполняю запрос из MySQL QueryBrowser'a
SELECT SQL_CACHE * from SQLINFO.t1 order by tstart desc limit 1;

после этого подключаюсь клиентом mysql, выполняю идентичный запрос - запрос опять выполняется несколько минут.
Между выполнениями select'ов таблица не меняется.

Пробовал наоборот - сперва путем mysql, после через MySQL Query Browser - результат оказался предсказуем, то же самое.

Переменные окружения mysql:

mysql> show variables like '%cach%';
+------------------------------+----------------------+
| Variable_name                | Value                |
+------------------------------+----------------------+
| binlog_cache_size            | 32768                |
| have_query_cache             | YES                  |
| key_cache_age_threshold      | 300                  |
| key_cache_block_size         | 1024                 |
| key_cache_division_limit     | 100                  |
| max_binlog_cache_size        | 18446744073709547520 |
| query_cache_limit            | 1048576              |
| query_cache_min_res_unit     | 4096                 |
| query_cache_size             | 33554432             |
| query_cache_type             | ON                   |
| query_cache_wlock_invalidate | OFF                  |
| table_cache                  | 512                  |
| thread_cache_size            | 8                    |
+------------------------------+----------------------+
13 rows in set (0.00 sec)


Понимаю, что проще было бы создать временную табличку или положить результат в файл, так и сделаю, если не получится договориться с кешированием, но все ж хотелось бы ). Подскажите кто знает, в чем может быть загвоздка.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#2 30.04.2010 15:12:22

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: кеширование результата запроса, который долго выполняется

Повторяемо ли, если перенести таблицу на локальную машину? Не надо Query Browser. Проверяйте просто двумя клиентами. Может быть Query Browser меняет одну букву запроса (например делает FROM заглавными буквами) и для кэша это уже другой запрос.

Неактивен

 

#3 11.05.2010 15:54:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: кеширование результата запроса, который долго выполняется

Если перенести таблицу на локальную машину - повторяемо.

От query browser'a отказался, пробовал гонять запросы тремя способами:

1) непосредственно через mysql-клиент (но подключался с разных хостов).
2) программа на c (использует mysql c api)
3) php-шный скрипт.

Получался везде один и тот же результат (перед каждым экспериментов делал reset query cache):

запускаю программу на одном хосте первый раз - запрос отрабатывается медленно.
запускаю ее же (просто скопировал бинарник на другой хост) сразу же после на другом хосте - запрос отработался быстро.

то же самое с php-скриптом - запускал его с разных хостов - первый раз ( сразу после reset query cache ) отрабатывается долго. второй раз (что с этой, что с другой машины) - сразу.

то же самое через mysql-клиент.

То есть если пробовать на "одном и том же" "материале" - нормально идет.

А вот если сперва сделать в mysql-клиенте, а потом в php, а потом через программу (пробовал разные вариации) - то каждый выполняется долго. И Qcache_queries_in_cache увеличивается на единицу после каждого запроса, хотя они одинаковы.

Запрос везде написан одними и теми же символами, без лишних пробелов и прочее.
Кодировка в системах всех utf-8.
Я уж и помыслить себе не могу, чем эти запросы отличаться могут между собой...

Может быть есть способ посмотреть, какой именно запрос пришел в кеш? Или еще как-то диагностировать?

Отредактированно deadka (11.05.2010 15:59:58)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 12.05.2010 09:48:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: кеширование результата запроса, который долго выполняется

А пользователь один и тот же?

Включите журнал запросов (--log) и посмотрите, одинаковые ли запросы приезжают
(должны совпадать с точностью до символа — проверка идет по md5 запроса).

Неактивен

 

#5 12.05.2010 15:33:24

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: кеширование результата запроса, который долго выполняется

Спасибо, включил --log, помогло в диагностике.

У меня не кешировалось из-за несовпадения set names.

Ряд экспериментов показал, что результат будет взят из кеша если:

1) запросы идентичны досимвольно (включая регистр, конечно).
2) подключение идет к одной и той же базе (даже если в запросе указана совсем другая!)
3) set names одинаков

Касательно пользователей - видимо это не учитыватся - прогонял под разными пользователями, и стучался на хосты и через доменное имя и через ip-адрес (в журнале по-разному отображались, конечно) на самого себя и через localhost и через 127.0.0.1 - везде успешно вынималось.

Так что проблема решена, спасибо!

Только уточнить хочу насчет задания параметра --log. Я логирование включил через my.cnf - а как прямо в командную строку добавить? Или так и надо - через my.cnf? Или лучше mysqld в /etc/rc.d/init.d менять?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 12.05.2010 16:05:57

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: кеширование результата запроса, который долго выполняется

Я обычно делаю через my.cnf smile

Кстати, в 5.1 есть возможность регулировать это на живом сервере (т.е. если у
Вас в my.cnf прописан --general-log-file, то можно включать-выключать его
через SET GLOBAL general_log = 1).

Неактивен

 

#7 12.05.2010 19:21:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: кеширование результата запроса, который долго выполняется

Ну да, судя по всему лучше через my.cnf, но в принципе так ведь тоже можно?  - в смысле залезть в shell-скрипт mysqld и в нем "ручками" добавить опцию --log? Или так все ж не рекомендуется делать?

Касательно 5.1 - спасибо, буду иметь в виду, пока еще на 5.0.77 живу ).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 12.05.2010 19:42:54

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: кеширование результата запроса, который долго выполняется

Ну, все зависит от того, как у Вас принято. Обычная технология подразумевает
редактирование конфигов, т.к. именно там другие администраторы будут искать
настройки.

Неактивен

 

#9 13.05.2010 13:00:54

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: кеширование результата запроса, который долго выполняется

paulus написал:

Обычная технология подразумевает
редактирование конфигов, т.к. именно там другие администраторы будут искать
настройки.

Да, похоже на то.

rgbeast написал:

Не надо Query Browser. Проверяйте просто двумя клиентами. Может быть Query Browser меняет одну букву запроса
(например делает FROM заглавными буквами) и для кэша это уже другой запрос.

Если интересно: эксперимент показал, что Query Browser тоже честно берет из кеша (если set names предварительно указать тот же, что был в той сессии, в которой результат запроса попал в кеш). Пробовал с различными регистрами, по умолчанию он ничего не меняет.


Григорий, Павел, подскажите пожалуйста, а все же сам этот хеш (запрос => результат) посмотреть как-то можно?
Или придется ограничиваться переменными, которые описывают его состояние?
И опять же - есть ли возможность получить данные про то, откуда результат - из кеша или "по-настоящему получен"?

Отредактированно deadka (13.05.2010 13:02:01)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#10 13.05.2010 13:23:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: кеширование результата запроса, который долго выполняется

Насколько я знаю, посмотреть нельзя. Смысла в том, чтобы узнать, получен ли
ответ из кэша или вычислен, — тоже не много. Но второе можно узнать, например,
профилированием запроса.

Неактивен

 

#11 13.05.2010 15:14:39

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: кеширование результата запроса, который долго выполняется

Вопрос, похоже, исчерпан, спасибо!


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson