Улучшение производительности ORDER BY без индексов в SQLite - PullRequest
0 голосов
/ 08 февраля 2012

Я использую базу данных Sqlite из 1 миллиона записей.У меня есть требование сортировки с несколькими столбцами.Для этого я создал составные индексы для баз данных, которые улучшили производительность по порядку, но производительность все еще остается плохой, когда мы изменяем порядок сортировки, чем указано в индексах.Например, я создал индекс Создать индекс StudentIDNAMEIndex (SID DESC, NAME DESC);

Производительность запроса ORDER BY резко снижается, когда я ORDER BY SID ASC, NAME DESC или любой другой комбинации.Поскольку невозможно добавить индекс для каждой комбинации, есть ли другой способ улучшить сортировку без индексов или эффективно использовать индексы?

1 Ответ

4 голосов
/ 08 февраля 2012

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

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

Вы должны найти эту таблицу намного быстрее для сортировки (потому что целые числа сравниваются быстрее, чем строки, и выиметь меньше данных для сортировки).Вы все еще можете присоединиться ко всем вспомогательным таблицам для исходных текстовых данных.Однако, если вы захотите ввести новый фрагмент текста, которого нет в вашей вспомогательной таблице, у вас будет много работы.И реструктуризация приложения для использования этой структуры требует большой работы.

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

...