Индексирование SQL Propper, диапазон + обычный поиск одновременно - PullRequest
0 голосов
/ 29 ноября 2011

Предположим, у меня есть простая таблица, подобная этой:

ID (PRIMARY)
time (INT)
stage (TINYINT)
other fields...

Я должен выполнить поиск диапазона по времени , в то время как обычно выбирает стадию . Пример запроса SQL:

SELECT * FROM table WHERE time>10000 AND (stage=1 OR stage=3 OR stage=4)

ОЧЕНЬ ВАЖНО: Есть много строк с stage = 2 , скажем, 99% таблицы. Есть только 5 различных значений стадии.

Какова будет правильная индексация этой таблицы?

Ответы [ 2 ]

1 голос
/ 29 ноября 2011

Создайте индекс с указанием времени первого и второго этапа, если в столбце этапа содержится низкий уровень мощности.Вы также можете изменить часть сцены на AND stage IN (2, 10), что может повысить производительность и удобочитаемость.:)

Удачи!

1 голос
/ 29 ноября 2011

Зависит от распределения значений в разных столбцах. Если у вас очень мало возможных значений stage, вы, вероятно, будете иметь лучшую производительность с отдельным индексом на time и одним на stage или с комбинированным индексом time, stage.

Но если у вас много различных stage значений, порядок индекса может быть быстрее: stage, time.

Но использование OR делает поиск stage более фрагментированным по сравнению с поиском AND. Поэтому я бы попытался иметь time первым в индексе.

Единственный способ узнать наверняка о вашем конкретном наборе данных - это попытаться измерить, но вышеупомянутые три кандидата - мои главные кандидаты в индексы.

Редактировать
Возможно, вы захотите создать кластеризованный индекс на time, возможно time, stage, если большинство ваших запросов будут искать по временному диапазону. Таким образом, вы минимизируете поиск в таблице, как только найдете правильные строки в индексе.
Помните, что это может создать фрагментированное пространство данных, если time строго увеличивается при вставке новых записей.

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