Top Banner
37

IndexedDB - Querying and Performance

Oct 18, 2014

Download

Documents

Talk at HTMl5DevConf on April 1, 2013 about IndexedDB, Plugins for IndexedDB and performance analysis of IndexedDB.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: IndexedDB - Querying and Performance
Page 2: IndexedDB - Querying and Performance
Page 3: IndexedDB - Querying and Performance

Prepare yourselves

The Mobile has arrived

Page 4: IndexedDB - Querying and Performance

Go where no website has gone before

Page 5: IndexedDB - Querying and Performance
Page 6: IndexedDB - Querying and Performance

Scotty, beam me up

I have good internet bandwidth

Page 7: IndexedDB - Querying and Performance

Work when you are disconnected too

Darth Vader Says

Page 8: IndexedDB - Querying and Performance

What if I told you

that adding Offline support is easy ?

Page 9: IndexedDB - Querying and Performance

A simple website

DATA inSERVER

DATA inBROWSER

Page 10: IndexedDB - Querying and Performance

SHOW ME

Page 11: IndexedDB - Querying and Performance

http://nparashuram.com/conference

Page 12: IndexedDB - Querying and Performance

var Session = Backbone.Model.extend({});var SessionList = Backbone.Collection.extend({});

var singleSession = new Session();singleSession.get(101);view.update(singleSession);

var allSessions = new SessionList();allSessions.fetch();view.render(allSessions);

Simple Read OperationAjaxHandler = { getSession: function (id) { // code goes here }, getAllSessions: function () { // code goes here }}

Page 13: IndexedDB - Querying and Performance

Backbone.sync = function (method, model, options, error) { switch (method) { case "read": // Methods for reading from database break; case "create": // Create a record here break; case "update": // Update Records break; case "delete": // Delete record }RemoteDatabase.replicate();});

Page 14: IndexedDB - Querying and Performance

case "read":// Pseudo Codeif (model.id) {// for a single Model db.get(model.id, function (err, res) { if (err) { error(err); return; } options.success(res); } );} else { // For all rows in the DB db.getAll ( function (err, resp) { if (err) { error(err); return; } options.success(resp); } );}

Page 15: IndexedDB - Querying and Performance

I totally understand you

With all that pseudo code

Page 16: IndexedDB - Querying and Performance

case "read": // Real IndexedDB Codeif (model.id) {// for a single Model var openReq = window.indexedDB.open("DatabaseName"); openReq.onsuccess = function () { var db = openReq.result; var transaction = db.transaction(["Model1”], "readonly"); var objectStore = transaction.objectStore("Model1"); var readReq = objectStore.get(model.id); readReq.onsuccess = function () { option.success(readReq.result); }; }; openReq.onerror = function (e) { options.error(e); };}

Page 17: IndexedDB - Querying and Performance

What did you just do ?

Page 18: IndexedDB - Querying and Performance

IndexedDB Refresher

http://yourwebpage.com search

Database

Cursor on Object Store

Object Store

key : value

key : value

key : value

Index

Cursor on Index

Database

Cursor on Object Store

Object Store

key : value

key : value

key : value

Index

Cursor on Index

Transaction

Page 19: IndexedDB - Querying and Performance

case "read":

if (model.id) { var openReq = window.indexedDB.open("DatabaseName"); openReq.onsuccess = function () { var db = openReq.result; var transaction = db.transaction(["Model1”], "readonly"); var objectStore = transaction.objectStore("Model1"); var readReq = objectStore.get(model.id); readReq.onsuccess = function () { option.success(readReq.result); }; }; openReq.onerror = function (e) { options.error(e); };}

Page 20: IndexedDB - Querying and Performance

You wrote so much code

Just to read a single record ?

Page 21: IndexedDB - Querying and Performance

case "read": // Jquery-IndexedDB Pluginif (model.id) { var openReq = window.indexedDB.open("DatabaseName"); openReq.onsuccess = function () { var db = openReq.result; var transaction = db.transaction(["Model1”], "readonly"); var objectStore = transaction.objectStore("Model1"); var readReq = objectStore.get(model.id); readReq.onsuccess = function () { option.success(readReq.result); };

readReq.onerror = function (e) { options.error(e); }; }; openReq.onerror = function (e) { options.error(e); };}

$.indexedDB("DatabaseName")

.objectStore("Model1") .get(model.id) .done(function(data) { }) .fail(function (error) {

});

Page 22: IndexedDB - Querying and Performance

case "read": // Jquery-IndexedDB Plugin$.indexedDB("DatabaseName") .objectStore("Model1") .get(model.id) .done(function (data) { option.success(data); }).fail(function (error) { option.error(error); });

$.indexedDB("DatabaseName") .objectStore("Model1") .each(function (record) { display(record); }).done(function () { // Finished with all records }).fail(function () { // Error });

• Less Verbose• Chainable API• Use Promises• Smart Defaults• Almost transparent

Project : gitbhub/axemclion/jquery-indexeddb

Page 23: IndexedDB - Querying and Performance

case "read":// Pouch DB Codeif (model.id) {// for a single Model db.get(model.id, {}, function (err, res) { if (err) { error(err); return; } options.success(res); } );} else { // For all rows in the DB db.allDocs ({}, function (err, resp) { if (err) { error(err); return; } options.success(resp); } );}

Pouch DB API

Project : http://pouchdb.com

Pouch.replicate("idb://data","http://me.couchdb.com/data");

Page 24: IndexedDB - Querying and Performance

Sure, but can you query data ?

Page 25: IndexedDB - Querying and Performance

$.indexedDB("DatabaseName") .objectStore("Model1") .where('price < 100') .sortBy('price') .desc()

Querying IndexedDB

objectStore.index('price').openCursor( IDBKeyRange.lowerBound(100, false), "prev");

Page 26: IndexedDB - Querying and Performance

$.indexedDB("DatabaseName") .objectStore("Model1") .where('price < 100 and >= 200') .sortBy('price') .desc()

Querying IndexedDB

objectStore.index('price').openCursor( IDBKeyRange.bound(100, 200, false, true), "prev");

Page 27: IndexedDB - Querying and Performance

$.indexedDB("DatabaseName") .objectStore("Model1") .where('price < 100 and >= 200') .sortBy('name') .desc() .done(function(results){ // do something with results // results.length == ??? })

Querying IndexedDB

var results =

objectStore.index('price').openCursor( IDBKeyRange.bound(100, 200, false, true), "prev");

Page 28: IndexedDB - Querying and Performance

$.indexedDB("DatabaseName") .objectStore("Model1") .where('price < 100 and >= 200') .where('ratings > 4') .sortBy('name') .desc() .each(function(result){ // process each result })

Querying IndexedDB

cursorReq = objectStore.index('name').openCursor();cursorReq.onsuccess = function () { if (cursorReq.result) {

val = cursorReq.result.value; if (val.price < 100 && val.price > 200 ) callback(val); cursorReq.result.continue(); }}

&& val.ratings > 4)

.done(function(results){ // do something with results // results.length == ??? })

Page 29: IndexedDB - Querying and Performance

$.indexedDB("DatabaseName") .objectStore("Model1") .where('price < 100 and >= 200') .where(‘Model2.empId < 5') .sortBy('name') .sortBy('price') .each(function(result){ // process each result });

Querying IndexedDB

Page 30: IndexedDB - Querying and Performance
Page 31: IndexedDB - Querying and Performance

$.indexedDB("DatabaseName") .objectStore("Model1") .where('price < 100 and >= 200') .where(‘Model2.empId < 5 ') .sortBy('name') .sortBy('price') .each(function(result){ // process each result });

Querying IndexedDB

Fall back on Web Workers to do the job

• Sorting on multiple columns• Where clauses across object stores• Sorting and clauses across object stores

Project : //linq2indexeddb.codeplex.com/

Page 32: IndexedDB - Querying and Performance

ONE DOES NOT SIMPLY START USING INDEXEDDB

WITHOUT LOOKING AT PERFORMANCE

Page 33: IndexedDB - Querying and Performance

Comparing IndexedDB and WebSQL ?

Page 34: IndexedDB - Querying and Performance
Page 35: IndexedDB - Querying and Performance

Performance Analysis

• Common cases when writing an application• Are string keys slower than integer keys• Should I combine read and write transactions ?

• Started with JSPerf, Problems with Async Setup• Using Benchmarkjs

Thanks to @slace for helping with code reviews

Page 36: IndexedDB - Querying and Performance

http://nparashuram.com/IndexedDB/perf

Page 37: IndexedDB - Querying and Performance

May the force be with you

http://nparashuram.com

@nparashuram

Resources

@OpenAtMicrosoft(@obloch)

http://nparashuram.com/IndexedDBhttp://www.html5labs.com/