7. Где Плагин к MySQL5.2.5 https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL PerconaServer 5.1 http://www.percona.com/downloads/Percona-Server-5.1/LATEST/
8. Applications Libmysql libhsclient Listener for libmysql SQL Layer Handlersocket Plugin Handler Interface InnoDb MyISAM Other storage engines … Структура HandlerSocket client app mysqld
10. Потоковая модель Небольшое кол-во потоков Несколько коннекций на один поток epollмодель Небольшое потребление памяти на один поток
11. Структура читающего потока reads requests from many clients locks the DB, gets a read view locks/unlocks (1/#conns) executes many requests unlocks the DB returns responses to clients
12. Структура пишущего потока reads requests from many clients Locks DB, begins a transaction locks/unlocks (1/#conns) executes many requests commits, and unlocks the DB returns responses to clients
16. Инсталляция [mysqld] # the port number to bind to (and for write) loose_handlersocket_port = 9998 loose_handlersocket_port_wr = 9999 # the number of worker threads loose_handlersocket_threads = 16 loose_handlersocket_threads_wr = 1 #to allow handlersocket accept connections open_files_limit = 65535
21. Почему следует знать Протокол? Если что-то на получается –то проверяем используя telnet Зная Протокол – лучше оптимизиация Написание тестов и патчей
24. Пример CREATE TABLE `test`.`test` ( `keyid` VARCHAR(45), `value` VARCHAR(45), `code` INT NULL , `code2` varchar(32) , PRIMARY KEY (`keyid`) , INDEX `code` (`code` ASC) INDEX `code2` (`code`, `code2`) )
25. Создание индекса P <indexid> <dbname> <tablename> <indexname> <columns> Разделитель ab P 0 test test PRIMARY keyid,value P 1 test test code keyid,code P 3 test test code2 keyid,code,code2
26. Простая выборка <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> >P 1 test test code keyid,code SELECT keyid,value FROM test.test WHERE code = ‘000123’ >1 = 1 000123
27. Простая выборка <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> >P 1 test test code keyid,code SELECT keyid,code FROM test.test WHERE code = 10 LIMIT 10 >1 = 1 10 10
28. Простая выборка <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> >P 2 test test code keyid,code,code2 SELECT keyid,code,code2 FROM test.test WHERE code = 10 AND code2=‘a’ LIMIT 10 >2 = 2 10 a 10
29. Формат ответа <errorcode> <numcols> <r1> ...<rn> 0 - успех Разделитель ab P 0 test test PRIMARY code,code2,keyid 0 1 0 = 1 100012 0 3 67 c 100012
30. Формат ответа <errorcode> <numcols> <r1> ...<rn> P 1 test test code code,code2,keyid 0 1 1 > 1 90 10 1 3 100200 91 a 100258 91 a 10027… 10 групп по 3
31. Вставка <indexid> '+' <vlen> <v1> ... <vn> Пишем в пишущий порт telnet localhost 9999 0 1 - успех Разделитель ab P 0 test test PRIMARY code,code2,keyid 0 1 0 + 3 1 f 102113 0 1
32. Удаление / Обновление <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <mop> <m1> ... <mk> 0 1- успех Модификатор U – update, D – delete P 0 test test PRIMARY code,code2,keyid 0 1 0 = 1 100001 1 0 D 0 1 1
33. Обновление / Удаление <indexid> <op> <vlen> <v1> ... <vn> <limit> <offset> <mop> <m1> ... <mk> 0 1 <numcols> Модификатор U – update, D – delete P 0 test test PRIMARY code,keyid 0 1 0 = 1 100003 1 0 U zzzzzzz 100003 0 1 1 0 = 1 100003 0 2 zzzzzzz 100003
34. Клиентские библиотеки libhsclient Net::HandlerSocket http://openpear.org/package/Net_HandlerSocket http://github.com/tz-lom/HSPHP http://code.google.com/p/php-handlersocket/