Частичный выбор MySQL (проблема с производительностью)

#php #mysql #sql

#php #mysql #sql

Вопрос:

У меня есть таблица с более чем 300 000 строк (общий размер таблицы составляет 600 МБ ).

Строки в таблице представляют собой записи событий, и у каждого есть временная метка (эпоха).

Для выполнения запроса к событиям, срок действия которых НЕ истек, я должен использовать WHERE epoch > currentepoch , но для выполнения такого запроса требуется 5-8 секунд. (На самом деле количество событий, срок действия которых НЕ истек, не превышает 6000)

Итак, для простого подсчета событий, срок действия которых НЕ истек, мой запрос занимает 5-8 секунд.

Есть ли какие-либо решения для этого? Могу ли я запросить часть таблицы? (Например, игнорирование событий с истекшим сроком действия и отсутствие MySQL вообще не пропускает их)

Примечание: движок — MyISAM

Примечание2: я не могу нормализовать таблицу, поскольку информация — это такие вещи, как описания и т. Д.

TLDR; Подсчет 6000 строк из таблицы из 300 000 строк занимает 5-8 секунд, решения?

Спасибо

ОБНОВЛЕНИЕ: Спасибо всем. После добавления индекса запрос выполняется менее чем за полсекунды. Ценю вашу помощь.

Комментарии:

1. У вас есть индекс в столбце эпохи?

2. Есть ли оба этих epoch и currentepoch являются полями таблицы?

3. Являются ли поля MySQL типами даты (времени) и имеют ли они комбинированный индекс? Пожалуйста, опубликуйте инструкцию CREATE TABLE и ваш запрос.

4. Если only epoch — это поле, есть ли у вас индекс для него?

5. ajaxline.com/32-tips-to-speed-up-your-mysql-queries также, вероятно, будет вам полезен

Ответ №1:

для этой цели существует так называемый индекс

 CREATE INDEX epoch ON tablename (epoch)
  

Ответ №2:

В случае, если это еще не очевидно из всех других ответов, вы должны создать индекс B-дерева в epoch столбце.

Кроме того, если вы еще не знакомы с использованием EXPLAIN для изучения эффективности ваших запросов, вы должны быть.

Ответ №3:

Всегда разумно применять индексацию к столбцам, которые используются в where предложении.

Ответ №4:

Как уже упоминалось, используйте index для currentepoch. Это позволяет быстрее выполнять поиск в таблице по этому столбцу.

Другим решением было бы пометить события как истекшие с помощью cronjob, обновляя все истекшие события значением, запускать его каждую минуту и просто искать по этому значению вместо использования > .

Ответ №5:

В основном вы должны создавать отдельные индексы для всех полей таблицы, которые вы ищете в своем предложении WHERE. Комбинированные индексы (с более чем одним полем) следует использовать в более сложных запросах, но имейте в виду, что индексы занимают пространство и ресурсы базы данных.

Я не уверен, что вы можете создавать индексы в таблицах MyISAM — я не очень разбираюсь в MySQL, поскольку предпочитаю реальные базы данных 😉 — но если вы не можете, вам следует преобразовать рассматриваемую таблицу в формат InnoDB, а затем создать нужные вам индексы.

Кстати, вы упомянули, что ваша таблица не нормализуема — это не может быть правдой, каждая таблица нормализуема в некоторой степени в зависимости от количества времени / усилий, которые вы хотите в нее вложить. Иногда, по мере увеличения объема данных, это единственный путь, но 300000 строк на самом деле не так много.

Удачи в ваших усилиях!

Комментарии:

1. БОЖЕ, I'm not sure that you can create indexes on myISAM tables

2. Я предпочитаю сюрреалистические базы данных 🙂

3. Я тоже задавался вопросом, были ли [I] ndexed [S] equential [A] ccess [M] файлы ethod [I] ndexed; P