У нас есть база данных с очень простой схемой:
CREATE TABLE IF NOT EXISTS tblIndex(
frame_type INT,
pts VARCHAR(5),
ts_start INT primary key,
ts_end INT)
И сценарий приложения:
Каждый второй пользователь будет вставлять 2 ~ 50 записей, и поля ts_start
этих записей всегда увеличиваются. Через 8 часов не более 1_800_000 записей. Если вы выключите режим синхронизации, производительность покажется нормальной. И поскольку данные каждой записи имеют только 16 байтов, мы можем использовать некоторый буфер, даже если скорость вставки не слишком высокая.
Через 8 часов пользователь скажет мне удалить самые старые данные, указав верхнюю границу ts_start, поэтому я сделаю
DELETE FROM tblIndex WHERE ts_start < upper_bound_ts_start.
Удаление 90_000 (то есть записей за полчаса) из 1_800_000 теперь занимает 17 секунд. Подстилка немного длиннее, чем ожидалось. Есть ли способ уменьшить это? Нам все равно, синхронизируются ли записи на жесткий диск немедленно. Мы думаем запустить отдельный поток для удаления, чтобы сделать этот вызов асинхронным. Я не уверен, что удаление (долгое время) повлияет на производительность вставки, если они используют одно и то же соединение? Или я должен использовать отдельное соединение для вставки и удаления? Но, таким образом, нужно ли их синхронизировать на уровне приложения?
Поиск. SELECT ts_start FROM tblIndex WHERE ts_start BETWEEN ? AND ?
- Поскольку ts_start является первичным ключом, производительность в настоящее время удовлетворительная для наших нужд. Я думаю, что я должен использовать отдельное соединение для поиска, верно?
Конфигурация SQLite:
hard disk database (usb interface)
cache size is 2000
page size is 1024
sync mode is 0 (off)
journal_mode mode is truncate
Спасибо за любые предложения по улучшению производительности удаления или по поводу общего дизайна.
РЕДАКТИРОВАТЬ: 350M MIPS CPU, не слишком много памяти (<2M) специально для этого приложения. </p>