Многостолбцовые индексы базы данных и скорость запросов - PullRequest
3 голосов
/ 09 июня 2011

Я развертываю приложение Rails, которое объединяет данные о купонах различных сторонних поставщиков в доступную для поиска базу данных.По каждому купону проводится поиск по четырем полям: заголовок, код купона, описание и срок действия.

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

Учитывая, что я ищу по этим столбцам (с помощью простого сопоставления WHERE column LIKE %whatever% на данный момент), я хочу, чтобы эти столбцы были по отдельности для каждого из них.Воспользуйтесь преимуществами увеличения скорости за счет их индексации.

Итак, вот мой вопрос: будет ли составной индекс по столбцам все обеспечивать такое же увеличение скорости поиска, как если бы я применял отдельный индекс каждый столбец?Или это только гарантирует уникальность между строками?

Несколько усложняет то, что я занимаюсь разработкой на Rails, поэтому мой вопрос касается как SQLite3, так и MySQL (и всего, что мы могли бы перенести в будущем)вместо одной конкретной СУБД.

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

Спасибо за предоставленную экспертизу.

1 Ответ

5 голосов
/ 09 июня 2011

будет составной индекс по всем столбцы обеспечивают одинаковый поиск увеличение скорости, как будто я применил индивидуальный индекс для каждого столбца?

Нет. Порядок столбцов в индексе очень важен. Предположим, у вас есть такой индекс: create unique index index_name on table_name (headline, coupon_code, description,expiration_date) В этом случае эти запросы будут использовать индекс

select * from table_name where headline = 1
select * from table_name where headline = 1 and cupon_code = 2

и эти запросы не будут использовать уникальный индекс:

select * from table_name where coupon_code = 1
select * from table_name where description = 1 and cupon_code = 2

Так что правило примерно такое. Если у вас есть несколько полей, проиндексированных вместе, то вы должны указать первое поле k, чтобы иметь возможность использовать индекс.

Таким образом, если вы хотите иметь возможность искать любое одно из этих полей, вам следует создать по индексу для каждого из них в отдельности (кроме комбинированный уникальный индекс)

Также будьте осторожны с оператором LIKE.

будет использоваться индекс SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; и это не будет SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';

использование индекса http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html индекс нескольких столбцов http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...