Чи запитує кеш-пам'ять MySQL?


19

Я поєдную базу даних MySQL з об'єктами даних PHP (PDO) і виконую широкий SQL-запит. Зазвичай це займає близько 1500 мс; Мені ще потрібно її оптимізувати. Коли я запускаю сценарій PHP двічі з коротким інтервалом між ними, запит займає лише близько 90 мс. В обох випадках запит однаковий. Коли я запускаю сценарій з тим же запитом, через деякий час знову потрібно 1500 мс.

Чому так? Чи кешується база даних автоматично? Чи є якийсь час база даних зберігає кеш, а потім автоматично видаляє його?

Я припускаю, що результати не можуть кешуватися PHP, оскільки це відбувається у двох різних потоках. Я не думаю, що PHP буде кешувати результати, оскільки він не може знати, чи змінилася база даних.

У мене сценарій працює щохвилини для вставки нових рядків у базу даних. Це також може бути причиною того, що через деякий час знову потрібно 1500 мс; кеш буде видалено, оскільки відповідні таблиці вже не однакові.


Покажіть мені свій код. Мені не потрібен ваш запит, просто спосіб, як ви його тестуєте.

3
Так, mySQL кешує запити. Це розумно.

@Kasyx який код? Це просто базове PDO, але я не думаю, що PHP може кешувати його, оскільки я запускаю сценарій PHP двічі, я не запускаю запит двічі в одному сценарії. Також ви могли б пояснити, чому ви відредагували pdo у, поки це насправді не стосується питання?

3
Усі СУБД мають певний кеш на рівні сторінки. Багато хто виходить за рамки кешування планів виконання запитів або навіть результатів запитів (включаючи MySQL ). Я підозрюю, що це останнє - головний винуватець вашої спостережуваної поведінки.
Бранко Димитріевич

Ви робите вставки щохвилини? Сортуйте це спочатку!
Грант Томас

Відповіді:


15

Ймовірно, це артефакт кешу запитів MySQL .

Ви виконуєте SQL-запит, MySQL кешує його результат та наступне виконання, якщо швидко. Коли ви запускаєте скрипт для вставки даних у таблиці, на які посилається ваш запит, кеш результату стає недійсним, а наступний запит повинен бути виконаний "по-справжньому".

З документації MySQL, зв'язаної вище:

Суміш запитів, що складається майже повністю з фіксованого набору операторів SELECT, набагато більше шансів отримати ввімкнення кешу, ніж суміш, в якій часті оператори INSERT викликають постійну недійсність результатів у кеші.


5

Так, mySQL (спільно з усіма іншими популярними продуктами баз даних) кешує запити, які йому задаються.

Кешування досить розумне - воно часто може використовувати кеш для запиту, навіть якщо точні параметри запиту неоднакові. Це може дуже змінити продуктивність.

Кешування повністю контролюється всередині програмного забезпечення сервера БД; у вас немає видимості того, що міститься кеш, а також скільки часу певний елемент залишається в кеші; він може бути перезаписаний у будь-який момент у залежності від того, які інші запити викликаються тощо. Він є для сприяння продуктивності, але на нього не слід покладатися.

Детальніше про це ви можете прочитати тут, у посібнику MySQL .

Крім того, використання PDO дозволяє записувати запити як "Підготовлені заяви", прив'язуючи параметри, а не жорстко кодуючи їх у звичайному текстовому рядку запиту. Це також має наслідки кешування на сервері БД, і для запитів, які повторюються, також покращиться продуктивність.


2
"За станом на MySQL 5.1.17 кеш запитів використовується для підготовлених операторів за умов, описаних у Розділі 8.6.3.1," Як працює кеш запитів ". До 5.1.17 кеш запитів не використовується для підготовлених операторів." dev.mysql.com/doc/refman/5.1/uk/query-cache.html

1
" спільне з усіма іншими популярними продуктами баз даних ": це трохи вводить в оману. Навряд чи будь-яка СУБД активно кешує результати запитів так, як це робить MySQL. СУБД, як правило, лише дані кешування (або індексу) даних , а не результати запитів . Більшість з них кешують план виконання запитів (і запит "джерело")
a_horse_with_no_name

3
"він часто може використовувати кеш для запиту, навіть якщо точні параметри запиту не однакові" є абсолютно невірним. Запит повинен бути байт-за-байтом, ідентичним попередньо виконаному та ще кешованому запиту, щоб бути поданим з кеша. Навіть різниця між SELECT *і select *означає, що інакше ідентичний запит не подаватиметься з кеша. dev.mysql.com/doc/refman/5.1/en/query-cache-operation.html . Опубліковано 5.1 посилання для узгодженості, але стосується всіх версій.
Майкл - sqlbot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.