За последние 24 часа нас посетили 16490 программистов и 1549 роботов. Сейчас ищут 2013 программистов ...

По поводу индексов (индекс всех полей)

Тема в разделе "PHP и базы данных", создана пользователем elkermo, 13 ноя 2008.

  1. elkermo

    elkermo Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    3
    Симпатии:
    0
    Ребят, привет! Подскажите пожалуйста.

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

    таблица выглядит так - { 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]

    Итак вопрос - нужно-ли индексировать все три поля (так как выборка производится по всем полям) ?

    Мне почему-то кажется что тут индексация особой роли не сыграет.. Хочется узнать у профи =)

    Заранее спасибо!
     
  2. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    ну сделай explain

    если ни о чем не говорит, то просто поставь индексы
     
  3. kostyl

    kostyl Guest

    elkermo
    не знаю как конкретно в mysql, но обычно индексные поля создаются чаще для постоянных таблиц. Здесь постоянных - значит таблиц, изменения в которых производяться не часто. Если в твоей таблице будут часто происходить изменения, то будет часто происходить переиндексация, что явно может сказаться на производитеьности. Наилучший способ определить, что тебе надо - это проверить экспериментально. Утилита ab, которая входит в дистрибутив apacha тебе может в этом помочь. Создай две таблицы одну с индексами другую без индексов и два скипта с одинкаовыми запросами, только обязательно в каждом скрипте добавь запрос на изменение данных.
     
  4. decoder

    decoder Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    469
    Симпатии:
    0
    Что-то, по-моему, бред какой-то.
    Немного про индексы:
    http://www.opennet.ru/base/dev/mysql_index.txt.html
    http://www.instanceof.ru/mysql/indexes-in-mysql
     
  5. kostyl

    kostyl Guest

    та нет, ты что, какой бред? чистая правда...
     
  6. decoder

    decoder Активный пользователь

    С нами с:
    11 фев 2006
    Сообщения:
    469
    Симпатии:
    0
    kostyl
    Вот для этого я и кинул тебе пару ссылок.
     
  7. elkermo

    elkermo Активный пользователь

    С нами с:
    13 ноя 2008
    Сообщения:
    3
    Симпатии:
    0
    Спасибо за ответы!

    Explain не особо помог, при выборке одного поля из 1 500 000 записей (по трем полям):
    Без индексов - 3.2971 секунд
    С идексами на поля IP и EVENT - 0.0006 секунд
    С идексами на все поля - 0.0006 секунд

    Я думаю лишним не будет, если и последнее поле (TIME) тоже проиндексить.. Хоть погоды и не делает, но при наличии большого числа пользователей мне кажется это поможет.

    Еще раз спасибо!)
     
  8. kostyl

    kostyl Guest

    elkermo
    индексируй те поля, с которыми операторы запроса могут работать как с индексными ну и которые ты естественно используешь в выражении запроса, тогда индексация теоретически максимально эффективна
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Я бы местами поменял
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Что-то мне подсказывает, что индекса по ip хватит. Не думаю что на одного юзера приходится много событий.
     
  11. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    а в чем разница?
     
  12. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Каждое условие отсеивает большинство записей, а оставшееся сравнивается со следующим условием. Вполне логично было бы ставить условия с лева направо по убыванию степени отсееваемости.
     
  13. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Kreker
    Насколько мне известно, порядок не имеет никакого значения. Оптимизатор сам решает, по каким условиям лучше оптимизировать. Но не уверен, надо проверять :)
     
  14. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Для этого ему надо прочесать все индексные поля и выяснить, где меньше уникальных записей, выбирать первее, где меньше - позже.

    Хотя везде пишут, что оптимизатор сам решает. А жаль.
     
  15. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    хм.. интересно, надо проверить
     
  16. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    и все-таки не согласен...

    http://dev.mysql.com/doc/refman/6.0/en/ ... tions.html

    написано, что mysql оптимизатор сам оптимизирует WHERE запрос, и многие его фишки даже не описаны в документации...

    Для OR получается нужен всего лишь выполнение хотя бы 1 условия... хотя и здесь наверняка будет одинаковое время... или очень очень очень слабо отличаться :)
     
  17. FORCE INDEX решает, и ниипет )