alasql.js - sql сервер на javascript

12
+ Alasql.js SQL сервер на JavaScript © Андрей Гершун, 2014 à la SQL à la SQL

Upload: andrey-gershun

Post on 05-Jul-2015

302 views

Category:

Software


3 download

DESCRIPTION

Презентация с докладом по библиотеке Alasql - сервере базы данных на JavaScript для браузеров и мобильных приложений

TRANSCRIPT

Page 1: Alasql.js - SQL сервер на JavaScript

+

Alasql.js

SQL сервер на JavaScript

© Андрей Гершун, 2014

à la

SQL

à la

SQL

Page 2: Alasql.js - SQL сервер на JavaScript

+SQL на JavaScript… Хм.

Применение

Быстрая обработка данных (сортировка, группировка, фильтрация,

слияния) на клиенте

Фронт-энд для Business Intelligence ( OLAP, таблицы)

Мобильные приложения с нерегулярной связью с сервером

Тренды

JavaScript – везде

JavaScript – оптимизирован

JavaScript – гибкий, комфортный, большое количество библиотек

Page 3: Alasql.js - SQL сервер на JavaScript

+Сложные запросы к данным

SELECT COUNT(*) FROM students

LEFT JOIN courses USING courseid

LEFT JOIN schools ON students.schoolid = schools.schoolid

WHERE courseid > 3

GROUP BY schools, courseid

ORDER BY courseid DESC, schoolid

filter(), sort(), map(), reduce()… - не просто…

Page 4: Alasql.js - SQL сервер на JavaScript

+Какие решения SQL существуют

для браузера?

Полноценные SQL (на базе SQLite)

WebSQL – “вне стандарта» с 2011 года (SQLite)

SQL.js – 1 Мб, компиляция с помощью Emscripten, небыстрый

SequelSphere – коммерческое решение (сайт не работает)

«Неполноценные SQL» (Аналоги LINQ)

SQLike

SQL…

NoSQL (Запросы через JSON)

IndexedDB

Key-value хранилища

Page 5: Alasql.js - SQL сервер на JavaScript

+Alasql.js – как использовать?

Подключение

Браузер

<script src=“alasql.js></script><script>alasql(‘CREATE DATABASE test01’) </script>

require([‘alasql’], function(alasql) {alasql(‘SELECT * FROM courses’);

})

Node.js

npm install alasql

require(‘alasql.js’)

Использование: «классический SQL»

alasql(‘CREATE DATABASE TEST01; USE TEST01;);

alasql(‘CREATE TABLE students (studentid INT, name STRING)’);

alasql(‘INSERT INTO students VALUES (100, “Иванов И.И.”)’);

var numStudents = alasql.value(‘SELECT COUNT(*) FROM students’);

Page 6: Alasql.js - SQL сервер на JavaScript

+SQL и JavaScript – лучше вместе

JS интерфейс

var db = new alasql.Database();var res = db.exec(‘SELECT * FROM one’);

Alasql как «супер-фильтр»

var data = [[1,2,3], [2,3,4], [5,6,7]];var res = alasql.value(‘SELECT * FROM ? WHERE [0] < ?’,[data, 2]);

Пользовательские функции

alasql.fn.myfn = function(a,b) {return a*10+b};

Компиляция операторов и функций

var myInsert = alasql.compile(‘INSERT INTO one VALUES (?,?)’);myInsert([5,6]);

Page 7: Alasql.js - SQL сервер на JavaScript

+SQL и JavaScript не всегда вместе

Схемы ускоряют исполнение

SELECT *

Схемы замедляют исполнение

PRIMARY KEY / FOREIGN KEY / UNIQUE INDEX

Без схемы никуда

Сравнение дат и других

Page 8: Alasql.js - SQL сервер на JavaScript

+Alasql изнутри

Лексер и парсер

Jison

Компилятор

Компиляция «критичных по скорости» операторов

SELECT/INSERT/UPDATE/DELETE

Проверка перед исполнением актульности версии схемы базы данных

Интерпретатор

Интепретация «больших» операторов (CREATE DATABASE, CREATE

TABLE и др.)

Page 9: Alasql.js - SQL сервер на JavaScript

+Разработка и тестирование

Gulp, Concat, Uglify – сборка библиотеки

Jison – лексер и парсер SQL

Mocha -тестирование

Более 200 тестов (и этого мало!) для Node.js и браузера

«Родные» тесты SQLite

Переход на «серьезные» тесты (NIST SQL)

zt

Тесты для сравнения скорости

Page 10: Alasql.js - SQL сервер на JavaScript

+Оптимизация SQL

Нужны ли вообще индексы...?

Да – замедление INSERT при наличии CONSTRAINTS

Нет – замедление при выполнении первый раз SELECT

Предварительная индексация SELECT

JOIN USING

one JOIN two ON one.a = two.a+1 AND one.b = two.c+two.d

Префильтрация WHERE в JOINs

Оптимизированный проход по SELECT

(1 раз для LEFT JOIN + 1 раз для RIGHT JOIN + 1 раз для GROUP +

sort)

Page 11: Alasql.js - SQL сервер на JavaScript

+Оптимизация JavaScript

Компиляция критических операций (SELECT, WHERE, ORDER BY, GROUP BY, HAVING, INSERT, DELETE, UPDATE):

SELECT * FROM data ORDER BY alpha, beta

data.sort(function(a,b){if(a.alpha>b.alpha) {return 1; else if(a.alpha==b.alpha) return 0;

if(a.beta>b.beta) {return 1; else if(a.beta==b.beta) return 0;}}return -1;

})

orderfn = new Function(‘scope’, ‘return ’+orderfns);

Существенно быстрее, чем интерпретация

Сложности с объектами (в частности датами) при отсутствии схемы

«Классическая» оптимизация JavaScript

for быстрее, чем forEach и т.д.

jsPerf - лучший советчик…

Page 12: Alasql.js - SQL сервер на JavaScript

+Где?

alasql,org – официальный сайт

https://github.com/agershun/alasql - GitHub