Я создал таблицу с sqlite для моего приложения corona/lua. Это хэш-таблица с ~ = 700 000 значений. Таблица имеет два столбца, которые являются хэш-кодом (строка) и значением (другая строка). Во время программы мне нужно получить данные несколько раз, предоставив хэш-код.SQLite data retrieve с выбранным слишком длинным
Я использую что-то вроде этого кода, чтобы получить данные:
for p in db:nrows([[SELECT * FROM test WHERE id=']].."hashcode"..[[';]]) do
print(p)
-- p = returned value --
end
Это утверждение, хотя с душевнобольно слишком много времени, чтобы выполнить
спасибо,
Edit:
Успех! ошибка была с Primare ключевых thing.I задают хэш-код в качестве первичного ключа, как показано ниже, и получить время whent к нормальному:
CREATE TABLE IF NOT EXISTS test (id STRING PRIMARY KEY , array);
я также подготовил заявления заранее, как вы сказали:
stmt = db:prepare("SELECT * FROM test WHERE id = ?;")
[...]
stmt:bind(1,s)
for p in stmt:nrows() do
Единственная проблема заключалась в том, что размер файла БД, который был около 18 МБ, пошел 29,5 MB
+1 для индекса, -1 для кеширования (редко окупается в sqlite, так как строка будет в кэше процессора в любом случае и не задействован сетевой ввод-вывод.) – finnw
, когда вы говорите, что индекс покрытия означает числовую индекс, как 1,2,3,4 ... было бы полезно? –
@ossumsiul Индекс покрытия является составным индексом, который * также * содержит дополнительные данные, необходимые для результата запроса (который имеет преимущество для уменьшения дополнительного доступа к первичной записи и имеет побочный эффект дублирования физических данных). Например, составной индекс над *, оба * '(id, value)' "покрывает" столбец 'value', хотя для нахождения' value' используется только столбец 'id' (который появляется в WHERE). Статья о планировщике запросов SQLite в сообщении достаточно хорошо объясняет, как это может помочь *. – user2864740