indexeddb - querying and performance

37

Post on 18-Oct-2014

11.316 views

Category:

Documents


2 download

DESCRIPTION

Talk at HTMl5DevConf on April 1, 2013 about IndexedDB, Plugins for IndexedDB and performance analysis of IndexedDB.

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/