Производительность технологии IndexedDB
может ли кто - нибудь указать мне на статью или предпочтительно предоставить некоторый опыт работы с IndexedDB (в идеале в Chrome) - какова производительность выборки, вставки и обновления?
кажется, есть разумное количество мнений, что его в значительной степени непригодно для наборов данных более нескольких тысяч записей, но я не уверен, что это не только из - за отсутствия индексирования-конечно, концептуально это не может быть медленнее, чем веб-хранилище, поскольку оба предположительно используют хранилище ключей внутренне?
спасибо
4 ответов
недавно я провел некоторые сравнения производительности между WebSQL и IndexedDB. Удивительно, но IndexedDB выиграл (чего я не ожидал).
http://blog.oharagroup.net/post/16394604653/a-performance-comparison-websql-vs-indexeddb
Edit: вышеуказанный URL вниз, но доступен на archive.org: http://web.archive.org/web/20160418233232/http://blog.oharagroup.net/post/16394604653/a-performance-comparison-websql-vs-indexeddb
в итоге:
WebSQL занимает в среднем между ~750-850ms для завершения запроса и рендеринга результатов; и IndexedDB занимает в среднем ~300-350ms для рендеринга тех же результатов.
единственная запись производительности, которую я видел, это тот, который производится @Scott (автор другой ответ на этот вопрос). К сожалению, его статья не делает справедливость базы данных SQL Web, поскольку она использует неэффективное предложение HAVING для ограничения размера результирующего набора. Я настроил SQL Скотта, заменив HAVING, GROUP BY и LEFT JOIN (почти) эквивалентом WHERE и sub-selects:
SELECT p.Name AS ProgramName,
s.rowid,
s.Name,
s.NowShowing,
s.ProgramID,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS IN ('Watched', 'Recorded', 'Expected') OR STATUS IS NULL) AS EpisodeCount,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS = 'Watched') AS WatchedCount,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS = 'Recorded') AS RecordedCount,
(SELECT COUNT(*) FROM Episode WHERE SeriesID = s.rowid AND STATUS = 'Expected') AS ExpectedCount
FROM Program p
JOIN Series s ON p.rowid = s.ProgramID
WHERE s.NowShowing IS NOT NULL OR
EXISTS (SELECT * FROM Episode WHERE SeriesID = s.rowid AND STATUS IN ('Recorded', 'Expected'))
ORDER BY CASE
WHEN s.NowShowing IS NULL THEN 1
ELSE 0
END,
s.NowShowing,
p.Name
Это примерно в 28 раз быстрее, чем оригинал - 20 ms vs 560 ms на моем компьютере - что, путем экстраполяции из чисел Скотта, делает его примерно в 10 раз быстрее, чем эквивалентный IndexedDB. Я не смог подтвердить это, потому что код IndexedDB не работает в моем браузере, по-видимому, из-за изменений API.
Я должен объяснить "(почти)", который я написал выше. Оригинальный SQL Скотта и мой имеют тонко разные значения: безвозмездное предложение WHERE на моем EpisodeCount , которое имеет эффект замены сканирования таблицы поиском индекса - может не сосчитать некоторые эпизоды, если он не охватывает все возможные значения состояния. Удаление этого пункта стирает разницу за счет удвоения времени выполнения до 40 мс.
обратите внимание, что ранее я обсуждали со Скоттом меньшее изменение его SQL, которое также достигает времени 40 мс.
обновление: большое спасибо Скотту за обновление его статьи отметить нашего обсуждения.
выполнение некоторого сравнения производительности между IndexeDB и другими клиентскими и серверными базами данных. Производительность зависит от браузера, поскольку реализация Firefox API IndexeDB намного опережает Chrome или IE. Firefox использует SQLlite в качестве бэкэнд-базы данных, поэтому IndexedDB реализован поверх нее. Вы можете найти много статей производительности IndexedDB, но в основном reserches и разработчики говорят, что IDB работает быстрее с SQL в качестве бэкэнда. В сравнении с Chrome реализация, где IDB реализован на верхней части LevelDB (который является NOSQL) гораздо медленнее по сравнению с Firefox. На другом конце WEBSQL (амортизированный) работает быстро в Chrome, в Firefox больше не поддерживается.
Я опубликовал статью с некоторыми результатами производительности IndexedDB. https://www.researchgate.net/profile/Stefan_Kimak/publication/281065948_Performance_Testing_and_Comparison_of_Client_Side_Databases_Versus_Server_Side/links/55d3465c08ae0a3417226302/Performance-Testing-and-Comparison-of-Client-Side-Databases-Versus-Server-Side.pdf
У меня были проблемы с массивной объемной вставкой (100.000-200.000 записей). Я решил все проблемы с производительностью IndexedDB, используя библиотеку Dexie. Он имеет эту важную особенность:
Dexie имеет kick-ass производительность. Это массовые методы используют преимущества не очень известная функция в indexedDB, которая позволяет хранить материал без прослушивания каждого события onsuccess. Это ускоряет производительность по максимуму.
Dexie: https://github.com/dfahlander/Dexie.js
BulkPut() -> http://dexie.org/docs/Table/Table.bulkPut()