Выберите много строк в столбце с низкой кардинальностью в SQLite

У меня есть таблица в SQLite с очень большим количеством строк, и мне часто нужно выбрать все строки на основе двоичного столбца с примерно равномерным разделением (например, мужчина/женщина). В запросе нет других условий, которые должны быть выполнены. Я понял, что индексировать в этом случае нехорошо, но есть ли другой способ сделать это быстро? Что-то вроде сортировки таблицы? Думаю, кроме создания двух отдельных таблиц.

РЕДАКТИРОВАТЬ: Если в SQLite нет, возможно ли это в другой СУБД на основе SQL?


person Rasmus    schedule 24.10.2019    source источник
comment
Э... индексирование похоже на сортировку таблицы. Либо проигнорируйте предыдущий совет, либо дайте хорошую ссылку на то, почему индекс в этом случае — плохая идея. Кроме того, содержимое таблицы сильно меняется или оно в основном статично? Я не могу себе представить, что заставить систему повторно сканировать всю таблицу при каждом запросе лучше, чем иметь далеко не идеальный индекс. Две таблицы звучат как очень раздражающая альтернатива, особенно если у вас есть другие запросы. Я не понимаю, как необходимость делать UNIONS и прыгать через другие обручи была бы лучше, чем индекс.   -  person C Perkins    schedule 24.10.2019
comment
Выбор между SQLite и другой СУБД на основе SQL, вероятно, должен основываться на множестве других факторов, а не только индексировать ли одну таблицу. Тем более, что SQLite — это встроенная база данных, предназначенная для очень специфических нужд локальной базы данных без сервера, тогда как большинство других СУБД SQL будут серверами и удовлетворят другие потребности.   -  person C Perkins    schedule 24.10.2019
comment
Конечно, и на основе этих факторов я выбрал SQLite (без сервера - большое преимущество, в основном база данных только для чтения, мало пользователей). Хотя размер огромен, но у меня сложилось впечатление, что запросы будут такими же быстрыми с SQLite, как и с какой-либо другой системой (возможно, быстрее, поскольку нет серверного уровня и слишком большая база данных для хранения в памяти). В любом случае, мне все равно не хватает некоторых функций в SQLite, например. материализованные представления, поэтому переключение является вариантом, если есть другие преимущества.   -  person Rasmus    schedule 25.10.2019
comment
Я также нашел болтовню о том, что такой низкий индекс кардинальности хуже, чем отсутствие индекса по разным причинам о том, что многие поиски по индексу менее эффективны. Возможно, это верно для поиска внешнего ключа или вторичного поиска (например, после того, как другие индексы используются для первичной сортировки). Но если такой индекс используется для простого выбора, хороший оптимизатор может разбить таблицу на блоки строк для эффективной обработки, а не запрашивать индекс для каждой отдельной строки. Честно говоря, я не готов так или иначе спорить о sqlite, но я думаю, что просто игнорировать/игнорировать это плохо. Проверь это.   -  person C Perkins    schedule 25.10.2019


Ответы (1)


Я так понял, что индексировать в этом случае нехорошо

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

В моих таймингах базы данных SQLite с 1 миллионом строк с двоичным столбцом, равномерно разделенным между 0 и 1, SELECT COUNT(*) WHERE binary = 0; был значительно ускорен с помощью индекса. Вот время u+s:

   without an index: 0.06 secs
   with an index:    0.04 secs

Для 10-метровых рядов разница была еще более заметной.

person peak    schedule 25.10.2019