У меня есть таблица, в которой хранятся некоторые основные данные о сессиях посетителей на сторонних веб-сайтах.Это его структура:
id, site_id, unixtime, unixtime_last, ip_address, uid
Существует четыре индекса: id
, site_id/unixtime
, site_id/ip_address
и site_id/uid
Существует много различных способов, которыми мызапросите эту таблицу, и все они относятся к site_id.Индекс с unixtime используется для отображения списка посетителей за заданный диапазон дат или времени.Два других используются для поиска всех посещений с IP-адреса или «uid» (уникального значения cookie, созданного для каждого посетителя), а также для определения, является ли это новым посетителем или возвращающимся посетителем.
Очевидно, что хранение site_id в 3-х индексах неэффективно как для скорости записи, так и для хранения, но я не вижу никакого способа обойти это, поскольку мне нужно иметь возможность быстро запросить эти данные для определенного конкретного site_id.
Любые идеи по созданиюэто более эффективно?
Я действительно не понимаю B-деревья, кроме некоторых очень простых вещей, но более эффективно иметь самый левый столбец индекса, который будет иметь наименьшую дисперсию - правильно?Потому что я решил, что site_id будет вторым столбцом индекса для ip_address и uid, но я думаю, что это сделает индекс менее эффективным, так как IP и UID будут различаться больше, чем идентификатор сайта, потому что у нас всего около 8000уникальных сайтов на сервер базы данных, но миллионы уникальных посетителей на всех ~ 8000 сайтах ежедневно.
Я также рассмотрел возможность полного удаления site_id из индексов IP и UID, так как шансы того же посетителя возрастаютк нескольким сайтам, которые совместно используют один и тот же сервер базы данных, довольно мало, но в тех случаях, когда это происходит, я боюсь, что будет довольно медленно определить, является ли это новый посетитель этого site_id или нет.Запрос будет выглядеть примерно так:
select id from sessions where uid = 'value' and site_id = 123 limit 1
... поэтому, если этот посетитель посетил этот сайт раньше, ему нужно было бы найти только одну строку с этим site_id, прежде чем он остановился.Это не обязательно будет супер быстро, но приемлемо быстро.Но скажем, у нас есть сайт, который получает 500 000 посетителей в день, и конкретный посетитель любит этот сайт и посещает его 10 раз в день.Теперь они впервые попадают на другой сайт на том же сервере базы данных.Приведенный выше запрос может занять довольно много времени для поиска во всех потенциально тысячах строк этого UID, разбросанных по всему диску, поскольку он не найдет ни одного для этого идентификатора сайта.
Любое пониманиеза то, чтобы сделать это как можно более эффективным, было бы полезно:)
Обновление - это таблица MyISAM с MySQL 5.0.Мои опасения касаются как производительности, так и места для хранения.Эта таблица предназначена для чтения и записи.Если бы мне пришлось выбирать между производительностью и хранилищем, меня больше всего беспокоит производительность, но обе важны.
Мы интенсивно используем memcached во всех областях нашего сервиса, но это не повод, чтобы не заботиться о дизайне базы данных.,Я хочу, чтобы база данных была максимально эффективной.