Как мне получить SQLite для кэширования результатов команды select - PullRequest
3 голосов
/ 10 марта 2011

Я запускаю веб-приложение с базой данных SQLite, которая выполняет только операции чтения. Пользователи подключаются к базе данных, выполняют поиск записей с помощью команды выбора и просматривают результаты в браузере. Но выбор довольно трудоемкий, потому что включает в себя сопоставление шаблонов символов в нескольких миллионах строк таблицы. (Размер таблицы результатов довольно мал).

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

Как я могу сделать это в SQLite? Есть ли прагма, которую мне нужно использовать? Я слышал, что в SQLite есть функция автоматического кэширования, но это, похоже, не помогает. Обратите внимание, что я использую службу хостинга, поэтому я не могу перестроить SQLite в любом случае.

Любая помощь будет высоко ценится.

Ответы [ 4 ]

1 голос
/ 10 марта 2011

Используют ли пользователи разные подключения к БД SQLite?Попробуйте использовать команду PRAGMA для увеличения размера кэша.

PRAGMA cache_size; 
PRAGMA cache_size = Number-of-pages;

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

Из документации: http://www.sqlite.org/pragma.html#pragma_cache_size

1 голос
/ 10 марта 2011

Я бы использовал внешнее решение для кэширования, такое как

memcached

или

APC / Zend Cache (на PHP)

Тогда у вас будет гораздо большеконтроль над вашим кешем (что хранить, время жизни, полная очистка кеша ...)

0 голосов
/ 06 января 2015

У меня очень похожая проблема, которую я пытался оптимизировать, хешируя запросы и сохраняя хэш / результат в таблице CACHE.Но есть и ошибки - например, команды:

SELECT * FROM myTable WHERE (col1 BETWEEN 1000 AND 2000) AND (col2='StackOverflow');
SELECT * FROM myTable WHERE (col2='StackOverflow') AND (col1 BETWEEN 1000 AND 2000);

Должны дать точно такой же ответ, но MD5 с этими двумя строками даст разные результаты.То же самое касается:

SELECT col1,col2 FROM myTable;
SELECT col2,col1 FROM myTable;

Если вы можете стандартизировать, как запросы поступают в базу данных (сортировка SELECTables, фильтры WHERE, группировка и т. Д. - все в нашем PHP / JavaScript), то вы можете надежно быстро хешироватьзапросы, выполните их, а затем сохраните результат в вашей базе данных.Я бы порекомендовал хранить его как JSON, если вы не собираетесь возвращать целые страницы, такие как OP, потому что это избавляет от необходимости конвертировать его позже, а JSON почти всегда архивируется перед отправкой пользователю (если ваш AJAXing на экране пользователя).

Чтобы действительно ускорить это, ваша таблица CACHE должна иметь столбец Hash, включающий тип UNIQUE, чтобы она автоматически индексировалась.

Если вы используете Node.js, то идите на один шаг дальше и скажете, что вы можете прочитать эту таблицу CACHE с диска при запуске, сохранить все хэши в заданном объекте, а затем, когда ваш сервер получит запрос простоdo allHashes.has (hashedSortedQuery).Поскольку эта операция происходит в памяти, она по сути мгновенная.Если это правда, ВЫБЕРИТЕ результат из CACHE, где Hash = 'hashedSortedQuery', иначе (фактический запрос).

Последнее замечание - из моего опыта, сделавшего то же самое, обновление моей версии SQLite имело ОГРОМНОЕ улучшение скорости,и я упоминаю об этом только потому, что часто на серверах общего хостинга последняя версия не всегда установлена.Вот сравнение, которое я сделал сегодня между глобальной версией SQLite, установленной на моем сервере, и последней версией SQLite, скомпилированной из источника: http://pastebin.com/hpWu3UCk

0 голосов
/ 12 марта 2011

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

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

У меня есть основная идея здесь .

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

Надеюсь, это поможет другим, работающим над подобными проблемами.

...