Forum Webscript.Ru
Общие => Базы данных => Тема начата: 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
-
Certer
типы данных вышеуказанных полей назови...
-
EMAIL => varchar(60)
ICQ => int(10)
LOGIN => varchar(20)
-
Certer
1. на тип данных varchar - не эфективно ставить индексы.
2. на поле icq ты конечно можешь поставить индекс... но сильного изменения результата ты не заметишь...
в всязи с этим ещё один вопрос какое кол-во записей ты планируешь видеть в своей таблице?
-
А почему на varchar не эффективно? на какие эффективно??
Если на поле ICQ тоже не надо ставить индекс, то получается и на int(10) не эффективно ставить индекс??
Кол-во записей 5 000 планирую.
-
Certer
А почему на varchar не эффективно? на какие эффективно??
за ответом на этот вопрос, обратись к теории индексации полей... или прими на веру... :)
за синтаксисом создания индексов идем сюда: http://dev.mysql.com/doc/mysql/en/create-index.html
-
обратись к теории индексации полей.
а где прочитать эту теорию???
-
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 записей, это совершенно не актуально...
-
А нафиг нам указывать столько много всего? Не проще прописать только (`EMAIL`,`ICQ`,`LOGIN`) да и дело с концами?
Вот только порядок можна поменять на LOGIN, ICQ, EMAIL...
-
volod
Не проще...
http://dev.mysql.com/doc/mysql/ru/mysql-indexes.html
-
-----------------------------------------------------------
http://dev.mysql.com/doc/mysql/ru/mysql-indexes.html>>
Если данная таблица имеет многостолбцовый индекс, то любой крайний слева префикс этого индекса может использоваться оптимизатором для нахождения строк. Например, если имеется индекс по трем столбцам (col1,col2,col3), то существует потенциальная возможность индексированного поиска по (col1), (col1,col2) и (col1,col2,col3).
-----------------------------------------------------------
Я это имел ввиду.
-
volod
Хорошо... теперь скажи какие индексы нужно создать для запросов:
... WHERE ICQ=\'nnnn\'
... WHERE LOGIN=\'nnnn\' and EMAIL=\'xxxx\'
Что в вопросе?
-
Если вопрос рассматривать "в лоб", то конечно и индексировать так же нужно. Но я почти что уверен, если автор продумает именно как там те запросы будут строится (where-условие), то вполне возможно редуцировать три индекса до двух или даже одного. Вот пример этого "одного" я и привел. Обрати внимание на порядок полей (логин, как наиболее часто употребляющийся идентификатор, номер аськи и уж потом емейл).
На 5 тыс. строк -- нет разницы, но для намного большего мы будем иметь существенный выиграш в дисковом пространстве.
-
А какое необходимо количество строк, чтобы можно было использовать индексы (чтобы от них был толк)??? я так понимаю 5 000 это очень мало???
-
Хм. Ой-й-й-й, боюся я бросаться вот этими точными цифрами... Где-то, начиная тысяч с 20-30 уже можна будет ощущать разницу.
НО. Учитывай также нагрузку на БД (будут ли твой сайт спамить круглые сутки иль нет), учитывай также взаимосвязаность этой таблици с другими, "умность" запросов (вот ка-а-ак сделаешь "," 20000х20000 -- вот и капец:))...
Короче, я такое скажу: если у тебя храницца одна-одинешенька таблицца, и строк в ней вряд ли перекинет за десяточку -- можна по поводу индексирования особо не клопотаться.
Хотя...