2012-05-20 5 views
0

Я бегу сайт, где нужно хранить информацию, как это:Можно ли оптимизировать таблицу mysql/myisam?

table: logs 
* date (date) 
* server_1 (unsigned int) 
* server_2 (unsigned int) 
* user_id (unsigned int) 
* ip (unsigned int) 
* service (enum) 
* traffic (unsigned bigint) 

Мои запросы выглядят primarliy так:

SELECT SUM(traffic) FROM logs WHERE user_id = 8381 AND date > DATE_ADD(CURDATE(), INTERVAL -7 DAY) AND service != 'unknown' 

У меня есть составной первичный ключ на всех полях, кроме трафика и индекс на user_id и услуге

Это более эффективный способ хранения трафика в качестве поплавка?

Также является MyIsam хорошим двигателем или я должен использовать innodb?

Или еще другая система баз данных?

Таблица становится довольно большой (десятки миллионов строк) и в значительной степени зависит от запросов.

+0

что делает 'EXPLAIN ...' say? – Alnitak

+0

Запрос имеет столбец 'hoster'. В определении вашей таблицы нет. –

+0

oh sorry hoster = service, отредактировал его –

ответ

1

MySQL won't use a composite index, если он не использует первые «N» полей в индексе:

MySQL может использовать индексы нескольких столбцов для запросов, которые проверяют все столбцы в индексе или запросов, тест только первый столбец, первые два столбца, первые три столбца и т. д. Если вы укажете столбцы в правильном порядке в определении индекса, один составной индекс может ускорить несколько видов запросов в одной таблице.

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

+0

И для этого конкретного запроса указатель на '(user_id, date)' –

+0

@ypercube или наоборот, в зависимости от того, какое поле имеет более высокую мощность ... – Alnitak

+0

НЕТ, есть условие диапазона на дату, так что он выиграл Не работайте наоборот. –

0

Как указывает Алнимак, вопрос в том, как определяются ваши индексы. Вероятно, одного индекса недостаточно, если вам нужен быстрый доступ к этим журналам.

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

  • Приведение атрибута трафика к поплавку не приносит производительности, оно не должно иметь значения.
  • MyISAM быстро! InnoDB будет медленнее, потому что он имеет все свои служебные транзакции на основе БД. Но: Это зависит от того, что вы хотите. MyISAM может быть действительно опасным, потому что он может прерываться всегда (выключение питания и т. Д.). Скорость будет основной причиной его использования, но я не думаю, что в вашем случае это будет иметь большое значение (как бы ни было индексирование). Всегда используйте InnoDB, если ваши данные не важны (для журналов вы можете проигнорировать это).
  • Другие СУБД ведут себя в основном как InnoDB. В настоящее время я использую PostgreSQL, который очень зрелый, но определенно не так быстро, как MyISAM.

Итак, попробуйте определить хорошие индексы. Запрос здесь нуждается в индексе на user_id, date. Примечание: Порядок важен!

+0

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

+0

@Alnitak: Да, но в этом случае это, скорее всего, user_id, потому что в поле даты используется оператор 'more than'. –

Смежные вопросы