Мне немного стыдно спрашивать об этом, так как я много лет работаю с MySQL, но хорошо.Несколько и одиночные индексы
У меня есть таблица с двумя полями, a
и b
. Я буду работать следующие запросы на него:
SELECT * FROM ... WHERE A = 1;
SELECT * FROM ... WHERE B = 1;
SELECT * FROM ... WHERE A = 1 AND B = 1;
С точки зрения производительности, по меньшей мере, один из следующих конфигураций индексов медленнее по крайней мере для одного запроса? Если да, пожалуйста, уточните.
ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b);
ALTER TABLE ... ADD INDEX (a, b);
ALTER TABLE ... ADD INDEX (a); ALTER TABLE ... ADD INDEX (b); ALTER TABLE ... ADD INDEX (a, b);
Спасибо (обратите внимание, что речь идет о не являющихся уникальных индексах)
И есть ли какое-либо преимущество в конфигурации №3 вместо # 1? –
Да, может быть преимущество. Составной индекс может стать индексом покрытия, когда все данные в запросе хранятся внутри самого индекса. В общем случае 'SELECT A, B FROM ... WHERE A = 1;' будет быстрее, если он использует составной индекс в '(A, B)', поскольку запрос не нужно будет извлекать любые данные из таблицы , Данные уже находятся в индексе. –
Помните, что индексы занимают пространство и могут скомпрометировать небольшую производительность при вставках и обновлениях. Я бы пошел с вариантом 3, только если ваше приложение будет делать запросы, которые оправдывают дополнительный индекс ... Советы по индексу покрытия: http://www.sql-server-performance.com/tips/covering_indexes_p1.aspx –