Ребят, привет! Подскажите пожалуйста. Есть таблица, в которой предполагается хранить события, и затем проверять их на уникальность. Наример юзер нажал на ссылку - сделалась проверка на уникальность этого действия если такого события еще небыло - записывается, было - не считается. таблица выглядит так - { ip_address | event_name | expire_date } ip_address - собственно адрес юзера (через INET_ATON()) event_name - имя события (MD5()) expire_date - дата, после просрочки которой запись трется (UNIX_TIMESTAMP() + срок хранения) Запрос будет примерно таким - [sql]SELECT * FROM `events` WHERE `ip_address` = INET_ATON('{$_SERVER['REMOTE_ADDR']}') AND `event_name` = MD5('{$event}') AND `expire_date` > UNIX_TIMESTAMP()[/sql] Итак вопрос - нужно-ли индексировать все три поля (так как выборка производится по всем полям) ? Мне почему-то кажется что тут индексация особой роли не сыграет.. Хочется узнать у профи =) Заранее спасибо!
elkermo не знаю как конкретно в mysql, но обычно индексные поля создаются чаще для постоянных таблиц. Здесь постоянных - значит таблиц, изменения в которых производяться не часто. Если в твоей таблице будут часто происходить изменения, то будет часто происходить переиндексация, что явно может сказаться на производитеьности. Наилучший способ определить, что тебе надо - это проверить экспериментально. Утилита ab, которая входит в дистрибутив apacha тебе может в этом помочь. Создай две таблицы одну с индексами другую без индексов и два скипта с одинкаовыми запросами, только обязательно в каждом скрипте добавь запрос на изменение данных.
Что-то, по-моему, бред какой-то. Немного про индексы: http://www.opennet.ru/base/dev/mysql_index.txt.html http://www.instanceof.ru/mysql/indexes-in-mysql
Спасибо за ответы! Explain не особо помог, при выборке одного поля из 1 500 000 записей (по трем полям): Без индексов - 3.2971 секунд С идексами на поля IP и EVENT - 0.0006 секунд С идексами на все поля - 0.0006 секунд Я думаю лишним не будет, если и последнее поле (TIME) тоже проиндексить.. Хоть погоды и не делает, но при наличии большого числа пользователей мне кажется это поможет. Еще раз спасибо!)
elkermo индексируй те поля, с которыми операторы запроса могут работать как с индексными ну и которые ты естественно используешь в выражении запроса, тогда индексация теоретически максимально эффективна
Что-то мне подсказывает, что индекса по ip хватит. Не думаю что на одного юзера приходится много событий.
Каждое условие отсеивает большинство записей, а оставшееся сравнивается со следующим условием. Вполне логично было бы ставить условия с лева направо по убыванию степени отсееваемости.
Kreker Насколько мне известно, порядок не имеет никакого значения. Оптимизатор сам решает, по каким условиям лучше оптимизировать. Но не уверен, надо проверять
Для этого ему надо прочесать все индексные поля и выяснить, где меньше уникальных записей, выбирать первее, где меньше - позже. Хотя везде пишут, что оптимизатор сам решает. А жаль.
и все-таки не согласен... http://dev.mysql.com/doc/refman/6.0/en/ ... tions.html написано, что mysql оптимизатор сам оптимизирует WHERE запрос, и многие его фишки даже не описаны в документации... Для OR получается нужен всего лишь выполнение хотя бы 1 условия... хотя и здесь наверняка будет одинаковое время... или очень очень очень слабо отличаться