Ich habe eine Demo-Chrome-Erweiterung erstellt, um websql und indexeddb zu vergleichen und zu lernen, wie beide ausführlicher arbeiten.IndexedDB sehr langsam im Vergleich zu WebSQL, was mache ich falsch?
Zu meiner Überraschung zeigte sich, dass indexeddb viel langsamer ist, sogar im Vergleich zum naivsten SQL-Befehl.
Da websql zugunsten indexeddb veraltet ist, nahm ich an, indexeddb wäre so schnell oder schneller als websql.
Ich nehme an, ich mache etwas falsch im Indexeddb-Code. Weil etwas, das viel schneller ist, zu verwerfen, wäre dumm und ich nehme an, sie wussten, was sie taten, wenn sie websql zugunsten indexeddb abschätzten.
Der SQL-Suchcode:
// Search entries
var term = search_query;
db.transaction(function(tx) {
tx.executeSql('SELECT * FROM places', [], function (tx, results) {
console.log("sql search");
var count = 0;
var wm = WordsMatch.init(term.trim().toLowerCase());
var len = results.rows.length
for (var i = 0; i < len; ++i) {
var item = results.rows.item(i);
if (wm.search(item.url.toLowerCase())) {
//console.log(item.id, item.url);
++count;
}
}
console.log("Search matches:", count);
console.log("\n");
});
}, reportError);
Der IndexedDB Suchcode:
PlacesStore.searchPlaces(search_query, function(places) {
console.log("indexedDB search");
var count = places.length;
console.log("Search matches:", count);
console.log("\n");
});
var PlacesStore = { searchPlaces: function (term, callback) {
var self = this,
txn = self.db.transaction([self.store_name], IDBTransaction.READ_ONLY),
places = [],
store = txn.objectStore(self.store_name);
var wm = WordsMatch.init(term.trim().toLowerCase());
Utils.request(store.openCursor(), function (e) {
var cursor = e.target.result;
if (cursor) {
if (wm.search(cursor.value.url.toLowerCase())) {
places.push(cursor.value);
}
cursor.continue();
}
else {
// we are done retrieving rows; invoke callback
callback(places);
}
});
}
}/**/
var Utils = {
errorHandler: function(cb) {
return function(e) {
if(cb) {
cb(e);
} else {
throw e;
}
};
},
request: function (req, callback, err_callback) {
if (callback) {
req.onsuccess = function (e) {
callback(e);
};
}
req.onerror = Utils.errorHandler(err_callback);
}
};
ich auch einen Chrom Bugreport gemacht und hochgeladen die volle Dateisuffix dort: http://code.google.com/p/chromium/issues/detail?id=122831
(Ich kann die Extension-Zip-Datei hier nicht hochladen, keine solche Funktion)
Ich füllte sowohl websql und indexeddb Datenbanken jeweils mit 38862 URLs, die ich als Testdaten verwendet.
In welchem Universum ist 38862 ein "großer" Datensatz? – ocodo
Im clientseitigen Speicheruniversum. – buley