MYSQL: Должен ли я создавать индексы для больших таблиц, используемых в качестве журналов? - PullRequest
7 голосов
/ 18 ноября 2010

У меня есть базовая таблица базы данных mysql для аналитики, которая отслеживает все ipaddresses и URL-адреса, посещенные при посещении пользователя, и время их посещения.Существует большое количество вставок (миллионов в день).

Через несколько дней выполнение запроса к таблице, чтобы выяснить, сколько пользователей посетили в определенный день, занимает очень много времени.

Должен ли я добавить индекс в таблицу?Будет ли он воссоздавать индекс после каждой вставки, и стоит ли это того?

Или есть лучший способ ускорить мои аналитические запросы?

Это, вероятно, распространенная ситуация (у всех есть логи).Каков наилучший способ ведения этой таблицы?

Ответы [ 5 ]

3 голосов
/ 18 ноября 2010

Любая таблица, которая будет позже запрошена, должна использовать индексы. Посмотрите на INSERT DELAYED, который быстро возвращается и предназначен для регистрации: -

http://dev.mysql.com/doc/refman/5.1/en/insert-delayed.html

Вероятно, это лучший вариант для таблиц журналов, хотя вы также можете взглянуть на механизм хранения архива, но он больше касается пространства, чем поиска: -

http://dev.mysql.com/doc/refman/5.1/en/archive-storage-engine.html

1 голос
/ 18 ноября 2010

+ 1 для вставки с задержкой в ​​другом ответе.

После полуночи вы можете хранить общее количество посетителей в другой таблице, например

insert into visitor_cache
  select date, count(1)
  from log
  where date < today
  group by date
;

После этого вы можете удалить записи из таблицы журналов.

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

1 голос
/ 18 ноября 2010

Если возможно, лучше обновить итоги, чем вставлять 10000000 записей.Например, вы можете иметь одну запись в день с количеством пользователей в этот день.Это сделает считывание намного более производительным, чем совокупность.Даже если вам нужны статистические данные за год, вы объединяете только 365 записей вместо 300 млн.

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

1 голос
/ 18 ноября 2010

MysQL 5.0 introdcue Archive Storage Engine ,
Я считаю, что ответят на большинство ваших вопросов

Должен ли я добавить индекс в таблицу
- да, если вы хотитевыполнить поиск

Будет ли он пересоздавать индекс после каждой вставки
- внутренне обрабатывается mysql

стоит
- зависит, добавление индекса немного замедлит операцию записи в базу данных(в зависимости от того, сколько индекса и длины записи)

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

1 голос
/ 18 ноября 2010

Он не будет воссоздан, но обновит индекс. Да, это занимает некоторое время, но не намного больше, чем простое обновление таблицы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...