У меня есть таблица SQLite, которая составляет около 30 миллионов строк на 500 столбцов. Три из этих столбцов:Оптимизировать таблицу SQLite для двух разных поисков
CREATE TABLE core (
state TEXT,
year INTEGER,
randInt INTEGER,
);
Моя основная польза для этой таблицы является SELECT
подмножеств, либо state
- year
парами или по сравнению с randInt
. randInt
является случайным числом, что в диапазоне от 0 до 100.
Примеры выбора состояния года:
SELECT * WHERE state='MA' AND year=1999;
SELECT * WHERE (state='MA' AND year=1999) OR (state='NJ' AND year=1998);
Примеры выбора randInt:
SELECT * WHERE randInt < 10;
SELECT * WHERE randInt = 10;
Эти два типа выборов содержат больше, чем 95% запросов к базе данных я буду делать. Есть ли способ оптимизировать таблицу специально для них?
Я предполагаю, что я хочу, чтобы явно CREATE INDEX
для randInt
и индекс соединения для state,year
, но я не знаю, если они имеют одно мешает другому, и я не знаю, как создавать составные индексы.
Должен ли я отключать индексирование всех остальных 497 столбцов, так как я редко буду когда-либо индексировать их?
Насколько я понял, индексы создаются по умолчанию в SQLite. Я определенно мог ошибаться. Кроме того, если я могу иметь не более одного индекса, должен ли я создать комбинированный столбец состояния года (например, конкатенировать их вместе)? Я определенно хотел бы сделать это, если бы это ускорило 'SELECT' даже 10%. –
Я думал об этом. Если вы планируете много запросов, я бы предложил иметь столбец в формате yearstate с целым числом, указывающим как год, так и состояние. Например (год * 100 + state_number). Индексирование этой переменной было бы очень просто для SQLite. –
О, и индекс в двух столбцах по-прежнему является единственным индексом. Я просто сказал, что если у вас есть индекс для (год, состояние) и индекс для (randInd), то только один из них будет использоваться в любом запросе, а не в обоих. –