Я связываю базу данных MySQL с объектами данных PHP (PDO) и выполняю обширный SQL-запрос. Обычно это занимает около 1500 мс; Я все еще должен оптимизировать это. Когда я дважды запускаю PHP-скрипт с небольшим интервалом, запрос занимает около 90 мс. Запрос в обоих случаях одинаков. Когда я запускаю сценарий с тем же запросом, через некоторое время это снова занимает 1500 мс.
Это почему? Кеширует ли база данных автоматически? Некоторое время база данных сохраняет кеш, а затем автоматически удаляет его?
Я предполагаю, что результаты не могут быть кэшированы PHP, потому что это происходит в двух разных потоках. Я не думаю, что PHP кэширует результаты, потому что он не может знать, изменилась ли база данных.
У меня есть скрипт, работающий каждую минуту, чтобы вставить новые строки в базу данных. Это также может быть причиной того, что через некоторое время снова потребуется 1500 мс; кэш был бы удален, потому что соответствующие таблицы больше не совпадают.
Ответы:
Вероятно, это артефакт MySQL Query Cache .
Вы выполняете запрос SQL, MySQL кэширует его результат и следующее выполнение, если это быстро. Когда вы запускаете сценарий для вставки данных в таблицы, на которые ссылается ваш запрос, кэш результатов становится недействительным, и в следующий раз запрос должен быть выполнен «по-настоящему».
Из документации по MySQL, указанной выше:
источник
Да, mySQL (как и все другие популярные продукты баз данных) кэширует запросы, которые к нему сделаны.
Кэширование довольно умно - оно часто может использовать кеш для запроса, даже если точные параметры запроса не совпадают. Это может иметь большое значение для производительности.
Кэширование полностью контролируется внутри программного обеспечения сервера БД; у вас нет никакой видимости того, что содержит кеш, и как долго данный элемент остается в кеше; он может быть перезаписан в любой момент в зависимости от того, какие другие запросы вызываются и т. д. Он предназначен для повышения производительности, но на производительность не следует полагаться.
Вы можете прочитать больше об этом здесь в руководстве MySQL .
Кроме того, использование PDO позволяет записывать ваши запросы как «Подготовленные операторы», связывая параметры, а не жестко кодируя их в виде строки простого текста. Это также имеет значение для кэширования на сервере БД и для повторяющихся запросов также повысит производительность.
источник
SELECT *
иselect *
означает, что в противном случае идентичный запрос не будет обслуживаться из кэша. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Выложена ссылка 5.1 для согласованности, но относится ко всем версиям.