Автор Тема: Работа с индексами при WHERE из разных столбцов  (Прочитано 5188 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Certer

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
У меня есть таблица 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

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Работа с индексами при WHERE из разных столбцов
« Ответ #1 : 09 Февраля 2005, 13:33:00 »
Certer
типы данных вышеуказанных полей назови...
And no religion too...

Оффлайн Certer

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Работа с индексами при WHERE из разных столбцов
« Ответ #2 : 09 Февраля 2005, 13:43:22 »
EMAIL => varchar(60)
ICQ => int(10)
LOGIN => varchar(20)

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Работа с индексами при WHERE из разных столбцов
« Ответ #3 : 09 Февраля 2005, 13:53:46 »
Certer
1. на тип данных varchar - не эфективно ставить индексы.
2. на поле icq ты конечно можешь поставить индекс... но сильного изменения результата ты не заметишь...

в всязи с этим ещё один вопрос какое кол-во записей ты планируешь видеть в своей таблице?
And no religion too...

Оффлайн Certer

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Работа с индексами при WHERE из разных столбцов
« Ответ #4 : 09 Февраля 2005, 13:56:53 »
А почему на varchar не эффективно? на какие эффективно??

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

Кол-во записей 5 000 планирую.

Оффлайн commander

  • Developer
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1298
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.webtips.ru
Работа с индексами при WHERE из разных столбцов
« Ответ #5 : 09 Февраля 2005, 14:13:01 »
Certer
Цитировать
А почему на varchar не эффективно? на какие эффективно??

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

за синтаксисом создания индексов идем сюда: http://dev.mysql.com/doc/mysql/en/create-index.html
And no religion too...

Оффлайн Certer

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Работа с индексами при WHERE из разных столбцов
« Ответ #6 : 09 Февраля 2005, 14:16:56 »
обратись к теории индексации полей.

а где прочитать эту теорию???

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Работа с индексами при WHERE из разных столбцов
« Ответ #7 : 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 записей, это совершенно не актуально...

Оффлайн volod

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Работа с индексами при WHERE из разных столбцов
« Ответ #8 : 11 Февраля 2005, 15:41:23 »
А нафиг нам указывать столько много всего? Не проще прописать только (`EMAIL`,`ICQ`,`LOGIN`) да и дело с концами?
Вот только порядок можна поменять на LOGIN, ICQ, EMAIL...

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru

Оффлайн volod

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Работа с индексами при WHERE из разных столбцов
« Ответ #10 : 11 Февраля 2005, 16:17:46 »
-----------------------------------------------------------
http://dev.mysql.com/doc/mysql/ru/mysql-indexes.html>>
Если данная таблица имеет многостолбцовый индекс, то любой крайний слева префикс этого индекса может использоваться оптимизатором для нахождения строк. Например, если имеется индекс по трем столбцам (col1,col2,col3), то существует потенциальная возможность индексированного поиска по (col1), (col1,col2) и (col1,col2,col3).
-----------------------------------------------------------
Я это имел ввиду.

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Работа с индексами при WHERE из разных столбцов
« Ответ #11 : 11 Февраля 2005, 16:35:32 »
volod

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

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


Что в вопросе?

Оффлайн volod

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Работа с индексами при WHERE из разных столбцов
« Ответ #12 : 11 Февраля 2005, 16:50:25 »
Если вопрос рассматривать "в лоб", то конечно и индексировать так же нужно. Но я почти что уверен, если автор продумает именно как там те запросы будут строится (where-условие), то вполне возможно редуцировать три индекса до двух или даже одного. Вот пример этого "одного" я и привел. Обрати внимание на порядок полей (логин, как наиболее часто употребляющийся идентификатор, номер аськи и уж потом емейл).
На 5 тыс. строк -- нет разницы, но для намного большего мы будем иметь существенный выиграш в дисковом пространстве.

Оффлайн Certer

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 5
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Работа с индексами при WHERE из разных столбцов
« Ответ #13 : 11 Февраля 2005, 17:44:08 »
А какое необходимо количество строк, чтобы можно было использовать индексы (чтобы от них был толк)??? я так понимаю 5 000 это очень мало???

Оффлайн volod

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 95
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Работа с индексами при WHERE из разных столбцов
« Ответ #14 : 11 Февраля 2005, 19:48:18 »
Хм. Ой-й-й-й, боюся я бросаться вот этими точными цифрами... Где-то, начиная тысяч с 20-30 уже можна будет ощущать разницу.
НО. Учитывай также нагрузку на БД (будут ли твой сайт спамить круглые сутки иль нет), учитывай также взаимосвязаность этой таблици с другими, "умность" запросов (вот ка-а-ак сделаешь "," 20000х20000 -- вот и капец:))...
Короче, я такое скажу: если у тебя храницца одна-одинешенька таблицца, и строк в ней вряд ли перекинет за десяточку -- можна по поводу индексирования особо не клопотаться.
Хотя...

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28