Что означает "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 вы используете и проверяете версию также для обеих систем. Поскольку другая версия также ведет себя немного иначе.