SQLite - создает и индексирует для каждого поля - PullRequest
3 голосов
/ 01 сентября 2010

Я создаю приложение, которое будет извлекать данные из базы данных SQLite и отображать их в таблице.

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

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

Мне не нужно беспокоиться о проблемах производительности INSERT, ALTER и т. Д., Поскольку новые данные будут добавляться очень редко.

Спасибо

Ответы [ 5 ]

5 голосов
/ 01 сентября 2010

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

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

2 голосов
/ 01 сентября 2010

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

Да, это возможно. должен , зависит от того, сколько у вас места на диске;индексы могут быть огромными .

2 голосов
/ 01 сентября 2010

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

Но не оптимизируйте, пока у вас не будет измерено проблемы с реальными данными. Преждевременная оптимизация - это кубический корень зла.

1 голос
/ 01 сентября 2010

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

Добавление индекса для каждой комбинации полей ускорит его - но это (N + 1)! индексов. Это потребует большого объема памяти и значительно замедлит работу любого DML.

Лучший компромисс -

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

С

0 голосов
/ 01 сентября 2010

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

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