Forum Webscript.Ru

Общие => Базы данных => Тема начата: Certer от 09 Февраля 2005, 13:31:19

Название: Работа с индексами при WHERE из разных столбцов
Отправлено: Certer от 09 Февраля 2005, 13:31:19
У меня есть таблица USERS.

В этой таблице при помощи WHERE я ищу информацию по трем столбцам, например: ICQ, LOGIN, EMAIL.
Причем в поиске участвуют сразу по два, три или одному столбцу:

... WHERE ICQ=\'nnnn\'
... WHERE LOGIN=\'nnnn\' and EMAIL=\'xxxx\'
... WHERE ICQ=\'nnnn\' and LOGIN=\'nnn\' and EMAIL=\'nnnn\'

Так вот вопрос: как создать индексы? каждому столбцу отдельный индекс или сразу трем столбцам один индекс?

P/S: имеется ввиду база MySQL
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: commander от 09 Февраля 2005, 13:33:00
Certer
типы данных вышеуказанных полей назови...
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: Certer от 09 Февраля 2005, 13:43:22
EMAIL => varchar(60)
ICQ => int(10)
LOGIN => varchar(20)
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: commander от 09 Февраля 2005, 13:53:46
Certer
1. на тип данных varchar - не эфективно ставить индексы.
2. на поле icq ты конечно можешь поставить индекс... но сильного изменения результата ты не заметишь...

в всязи с этим ещё один вопрос какое кол-во записей ты планируешь видеть в своей таблице?
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: Certer от 09 Февраля 2005, 13:56:53
А почему на varchar не эффективно? на какие эффективно??

Если на поле ICQ тоже не надо ставить индекс, то получается и на int(10) не эффективно ставить индекс??

Кол-во записей 5 000 планирую.
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: commander от 09 Февраля 2005, 14:13:01
Certer
Цитировать
А почему на varchar не эффективно? на какие эффективно??

за ответом на этот вопрос, обратись к теории индексации полей... или прими на веру... :)

за синтаксисом создания индексов идем сюда: http://dev.mysql.com/doc/mysql/en/create-index.html
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: Certer от 09 Февраля 2005, 14:16:56
обратись к теории индексации полей.

а где прочитать эту теорию???
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: Phoinix от 09 Февраля 2005, 17:20:04
commander
Цитировать
1. на тип данных varchar - не эфективно ставить индексы.

???
Цитировать
за ответом на этот вопрос, обратись к теории индексации полей... или прими на веру...

?!?!?!
Хорошая идея... особенно обращение к теории индексации... сам то давно к ней обращался?

Certer

ALTER TABLE `database`.`my_table` ADD INDEX `index1` (`EMAIL`,`ICQ`,`LOGIN`);
ALTER TABLE `database`.`my_table` ADD INDEX `index1` (`EMAIL`,`LOGIN`);
ALTER TABLE `database`.`my_table` ADD INDEX `index1` (`ICQ`,`LOGIN`);
ALTER TABLE `database`.`my_table` ADD INDEX `index1` (`LOGIN`);

Соответсвенно, условие WHERE только в порядке:
EMAIL, ICQ, LOGIN

Правда для 5000 записей, это совершенно не актуально...
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: volod от 11 Февраля 2005, 15:41:23
А нафиг нам указывать столько много всего? Не проще прописать только (`EMAIL`,`ICQ`,`LOGIN`) да и дело с концами?
Вот только порядок можна поменять на LOGIN, ICQ, EMAIL...
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: Phoinix от 11 Февраля 2005, 16:00:38
volod

Не проще...

http://dev.mysql.com/doc/mysql/ru/mysql-indexes.html
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: volod от 11 Февраля 2005, 16:17:46
-----------------------------------------------------------
http://dev.mysql.com/doc/mysql/ru/mysql-indexes.html>>
Если данная таблица имеет многостолбцовый индекс, то любой крайний слева префикс этого индекса может использоваться оптимизатором для нахождения строк. Например, если имеется индекс по трем столбцам (col1,col2,col3), то существует потенциальная возможность индексированного поиска по (col1), (col1,col2) и (col1,col2,col3).
-----------------------------------------------------------
Я это имел ввиду.
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: Phoinix от 11 Февраля 2005, 16:35:32
volod

Хорошо... теперь скажи какие индексы нужно создать для запросов:

Цитировать
... WHERE ICQ=\'nnnn\'
... WHERE LOGIN=\'nnnn\' and EMAIL=\'xxxx\'


Что в вопросе?
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: volod от 11 Февраля 2005, 16:50:25
Если вопрос рассматривать "в лоб", то конечно и индексировать так же нужно. Но я почти что уверен, если автор продумает именно как там те запросы будут строится (where-условие), то вполне возможно редуцировать три индекса до двух или даже одного. Вот пример этого "одного" я и привел. Обрати внимание на порядок полей (логин, как наиболее часто употребляющийся идентификатор, номер аськи и уж потом емейл).
На 5 тыс. строк -- нет разницы, но для намного большего мы будем иметь существенный выиграш в дисковом пространстве.
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: Certer от 11 Февраля 2005, 17:44:08
А какое необходимо количество строк, чтобы можно было использовать индексы (чтобы от них был толк)??? я так понимаю 5 000 это очень мало???
Название: Работа с индексами при WHERE из разных столбцов
Отправлено: volod от 11 Февраля 2005, 19:48:18
Хм. Ой-й-й-й, боюся я бросаться вот этими точными цифрами... Где-то, начиная тысяч с 20-30 уже можна будет ощущать разницу.
НО. Учитывай также нагрузку на БД (будут ли твой сайт спамить круглые сутки иль нет), учитывай также взаимосвязаность этой таблици с другими, "умность" запросов (вот ка-а-ак сделаешь "," 20000х20000 -- вот и капец:))...
Короче, я такое скажу: если у тебя храницца одна-одинешенька таблицца, и строк в ней вряд ли перекинет за десяточку -- можна по поводу индексирования особо не клопотаться.
Хотя...