Что означает "SELECT/*! N SQL_NO_CACHE */* FROM` mytable`" в MySQL медленном журнале запросов?
Я только что включил медленное ведение журнала в моей базе данных MySQL, добавив следующее к /etc/mysql/my.cnf
:
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 1
Когда я запускаю mysqldumpslow, он выдает следующее:
Reading mysql slow query log from mysql-slow.log
Count: 1 Time=199.23s (199s) Lock=0.00s (0s) Rows=32513.0 (32513), ...
SELECT /*!N SQL_NO_CACHE */ * FROM `mytable`
...
Посмотрев на исходный mysql-slow.log
, полный запрос:
SELECT /*!40001 SQL_NO_CACHE */ * FROM `mytable`;
Итак, mysqldumpslow
просто заменил номер на N
(чтобы помочь агрегировать похожие запросы.)
Итак, вопрос в том, откуда взялся этот запрос и что означает бит /*!40001 SQL_NO_CACHE */
?
Насколько я могу судить, возможно, из команды mysqldump
, которая делала резервную копию (следовательно, не желая кэшировать данные), похоже ли это правильно? И если это так, поскольку он читает только 32 000 строк, почему это заняло 199 секунд?
Есть еще несколько похожих запросов в других таблицах, принимающих 100, 50 и более, до более разумных 3-х, большинство из которых имеют около 10-20 000 строк, самый большой с 450 000 строк.
Ответы
Ответ 1
Запрос, вероятно, "медленный", потому что клиент (ваша система резервного копирования) должен читать каждую строку в вашей таблице; который занимает, очевидно, 199 секунд.
Обратите внимание, что если вы сделали что-то вроде:
SELECT * FROM table LIMIT 100;
// read 50 rows
// sleep for 5 minutes
// read last 50 rows
Вышеуказанный запрос появится в медленном журнале, потому что с момента его первого запуска, когда он сможет закончить (отправив последнюю запрошенную строку), это заняло 5 минут.
Ответ 2
/*!40001 SQL_NO_CACHE */
означает, что в версиях mysql >= 4.0.1 выполнить SELECT SQL_NO_CACHE * FROM mytable
и в более ранних версиях выполнить команду без SQL_NO_CACHE.
Также mysqldump использует синтаксис /*!40001 SQL_NO_CACHE */
.
Я не уверен, почему ваши запросы будут такими медленными.
Ответ 3
Вопрос настройки может быть рассмотрен вами для того, чтобы этот запрос выполнялся быстрее, чем btw, SQL_NO_CACHE означает, что этот запрос будет выполняться без возможности его сохранения в кеше запросов. Например, вы можете использовать этот HINT, SQL_NO_CACHE, чтобы избежать кэширования этого запроса, чтобы проверить время выполнения.
Проверьте это: http://dev.mysql.com/doc/refman/5.0/en/query-cache-in-select.html
Больше HINTS для использования в запросах: http://www.petefreitag.com/item/613.cfm
Cheers, WB
Ответ 4
Из моей работы я также столкнулся с той же проблемой. Тогда я попытался двумя способами решить эту проблему.
Во-первых, я увеличиваю размер mysql_query_cache
и увеличиваю пространство на локальной машине.
Во-вторых, я проверил размер удаленного сервера mysql_query_cache
и увеличил пространство в папке temp.
Потому что, что я получил от исследования, что эта система работает в обоих направлениях и дает нам ощущение, что нам нужно увеличить пространство в определенном месте.
Итак, будьте конкретными, какие mysqldum
p вы используете и проверяете версию также для обеих систем. Поскольку другая версия также ведет себя немного иначе.