alasql.js - sql сервер на javascript
DESCRIPTION
Презентация с докладом по библиотеке Alasql - сервере базы данных на JavaScript для браузеров и мобильных приложенийTRANSCRIPT
![Page 1: Alasql.js - SQL сервер на JavaScript](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/1.jpg)
+
Alasql.js
SQL сервер на JavaScript
© Андрей Гершун, 2014
à la
SQL
à la
SQL
![Page 2: Alasql.js - SQL сервер на JavaScript](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/2.jpg)
+SQL на JavaScript… Хм.
Применение
Быстрая обработка данных (сортировка, группировка, фильтрация,
слияния) на клиенте
Фронт-энд для Business Intelligence ( OLAP, таблицы)
Мобильные приложения с нерегулярной связью с сервером
Тренды
JavaScript – везде
JavaScript – оптимизирован
JavaScript – гибкий, комфортный, большое количество библиотек
![Page 3: Alasql.js - SQL сервер на JavaScript](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/3.jpg)
+Сложные запросы к данным
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](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/4.jpg)
+Какие решения 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](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/5.jpg)
+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](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/6.jpg)
+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](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/7.jpg)
+SQL и JavaScript не всегда вместе
Схемы ускоряют исполнение
SELECT *
Схемы замедляют исполнение
PRIMARY KEY / FOREIGN KEY / UNIQUE INDEX
Без схемы никуда
Сравнение дат и других
![Page 8: Alasql.js - SQL сервер на JavaScript](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/8.jpg)
+Alasql изнутри
Лексер и парсер
Jison
Компилятор
Компиляция «критичных по скорости» операторов
SELECT/INSERT/UPDATE/DELETE
Проверка перед исполнением актульности версии схемы базы данных
Интерпретатор
Интепретация «больших» операторов (CREATE DATABASE, CREATE
TABLE и др.)
![Page 9: Alasql.js - SQL сервер на JavaScript](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/9.jpg)
+Разработка и тестирование
Gulp, Concat, Uglify – сборка библиотеки
Jison – лексер и парсер SQL
Mocha -тестирование
Более 200 тестов (и этого мало!) для Node.js и браузера
«Родные» тесты SQLite
Переход на «серьезные» тесты (NIST SQL)
zt
Тесты для сравнения скорости
![Page 10: Alasql.js - SQL сервер на JavaScript](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/10.jpg)
+Оптимизация 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](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/11.jpg)
+Оптимизация 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](https://reader030.vdocuments.mx/reader030/viewer/2022013118/559897321a28ab534b8b468e/html5/thumbnails/12.jpg)
+Где?
alasql,org – официальный сайт
https://github.com/agershun/alasql - GitHub