#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