За последние 24 часа нас посетили 16924 программиста и 1291 робот. Сейчас ищут 1393 программиста ...

Помощь с оптимизацией запроса MySQL в PHP

Тема в разделе "PHP и базы данных", создана пользователем misenor368, 16 дек 2024.

  1. misenor368

    misenor368 Гость

    С нами с:
    16 дек 2024
    Сообщения:
    1
    Симпатии:
    0
    Здравствуйте!

    Столкнулся с проблемой при работе с большим объемом данных в базе MySQL. Есть таблица с более чем 1 миллионом записей, и запросы на выборку начали сильно тормозить.

    Я использую PDO в PHP для взаимодействия с базой данных. Пример моего запроса:

    Код (Text):
    1. $query = "SELECT * FROM users WHERE status = :status AND created_at > :date";
    2. $stmt = $pdo->prepare($query);
    3. $stmt->execute(['status' => 'active', 'date' => '2023-01-01']);
    4. $results = $stmt->fetchAll();
    Индексы на status и created_at установлены, но производительность всё равно оставляет желать лучшего.
    Может быть, я что-то упустил в плане оптимизации?

    I check this: https://php.ru/forum/threads/gugl-xrom-ne-vidit-versiju-dlja-mobilnyx-ustrojsvaws-devops Также хотел бы узнать, есть ли лучшие практики по работе с такими объемами данных в PHP. Например, стоит ли использовать пагинацию или разделение данных на партии (batch processing)?

    Буду благодарен за советы или ссылки на полезные материалы!

    Спасибо!
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Определённо
    Очевидно же, что первое, что нужно предпринять, смена типов данных в этих колонках. На INT
    Не помешает также и оптимизировать саму таблицу, дефрагментировав её.
    https://habr.com/ru/articles/41166/
     
  3. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Далее стоит пересмотреть структуру таблицы - хорошей практикой будет перенос всех динамических данных в отдельную таблицу, или, даже, несколько
     
  4. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    922
    Симпатии:
    143
    БД не такие убитые, если `status` ENUM, есть сомнениея, что замена на INT поможет.
    EXPLAIN сделать конечного запроса, скорее всего на `created_at` индекс не срабатывает, ибо сравнение неточное.
    Вообще дамп структуры таблицы показать надо хотя бы.
     
  5. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Имелось в виду преобразование в UNIX-формат