EDIT: хорошо, это была моя ошибка. Я сделал ошибку, сбросив значения наименьших цен. В базе данных все еще были старые неправильные значения. Всякий раз, когда я нажал в своем приложении на продукте, чтобы получить его идентификатор и посмотреть его в базе данных, aftersave-hook вызовет перерасчет наименьшей цены, тем самым изменив его на новое правильное значение. И я ошибочно предположил, что поиск продукта в БД изменит кешированное значение для less_price. Я бы удалил этот вопрос, так как маловероятно, чтобы кто-то помог, но люди уже ответили. Благодарю вас и извините, если я потратил впустую никого.
Недавно я установил все значения одного поля (least_price
) моих products
таблицы в новые (более высокие) значения с помощью php-скрипта. Теперь я запускаю этот запрос:
SELECT Products.*
FROM products Products
WHERE
(
Products.least_price > 240
AND Products.least_price < 500
) ;
и набор результатов содержит некоторые продукты с новым значением least_price
стоимости выше 500. Результат будет показывать неправильные (я принимаю старые) значения для поля наименьшее значение. Если я запрашиваю конкретный продукт с select product where id = 123
, у которого есть новая наименьшая цена выше 500, она будет правильно отображать (более новую/более высокую) least_price
. В следующий раз, когда я запустил первый вышеупомянутый запрос, результат будет меньше на один продукт, а отсутствующий продукт - тот, который я запросил отдельно.
Может ли это поведение объясняться кешем запроса? Я попытался запустить RESET QUERY CACHE
, но у меня нет преувеличений, чтобы сделать это, к сожалению, с этим хостинг-провайдером. Есть ли что-нибудь еще, что я могу сделать, чтобы предупредить mysql, что атрибут least_price
изменился?
Я использую mysql 5.6.38-nmm1-log на машине debian-linux-gnu x86_64 с innodb 5.6.38
Нет, это невозможно из-за кэша запросов.
Кэш запросов не кэширует ссылки на строки, он кэширует фактические результаты, которые были возвращены. Поэтому он не может содержать результаты, которые не соответствуют критериям в запросе.
Результат кэширования для запроса очищается, если какая-либо из таблиц, которые он использует, изменяется. Поэтому он никогда не будет возвращать устаревшие данные.
Подробные сведения о работе кеша запросов MySQL см. В разделе "Кэш запросов MySQL".
Если least_price
индексирован, ваш неправильный результат может быть вызван поврежденным индексом, попробуйте восстановить таблицу.
The storage engine for the table doesn't support repair