Charla Mysql

2,956 views

Published on

Published in: Technology
  • Be the first to comment

Charla Mysql

  1. 1. <ul><li>MySQL Avanzado </li></ul><ul><li>Jornadas Regionales de Software Libre 2008 </li></ul><ul><li>Ing. Matías Alejo García </li></ul><ul><li>[email_address] </li></ul><ul><ul><li>Confronte.com </li></ul></ul><ul><ul><li>UADE </li></ul></ul>
  2. 2. <ul><li>MySQL Avanzado </li></ul><ul><li>20 Trucos para MySQL </li></ul><ul><li>Jornadas Regionales de Software Libre 2008 </li></ul><ul><li>Ing. Matías Alejo García </li></ul><ul><li>[email_address] </li></ul><ul><ul><li>Confronte.com </li></ul></ul><ul><ul><li>UADE </li></ul></ul>
  3. 3. <ul><li>Agenda </li></ul><ul><li>Historia y versiones </li></ul><ul><li>20 trucos y consejos para MySQL </li></ul>
  4. 4. <ul><li>Multi-thread, multi-user, robust SQL server. </li></ul><ul><li>© MYSQL AB. Primera version 1995. </li></ul><ul><li>Mission critical, heavy load production server. </li></ul><ul><li>Dos licencias GNU GPL y Comercial. </li></ul><ul><li>Escrito en C y C++. </li></ul><ul><li>Open Source. Comunidad muy activa. 10 mill de instalaciones. </li></ul><ul><li>MaxDB es otro proyecto de MYSQL AB. </li></ul><ul><li>ANSI SQL / ODBC SQL. SQL99. </li></ul>
  5. 5. <ul><li>Diferentes “Storage engines”. </li></ul><ul><li>Casos de 60000 tablas, 5000mill filas. </li></ul><ul><li>Hasta 64 índices por tabla. (767/1000 bytes por índice) </li></ul><ul><li>Conexión por TCP Sockets / UNIX Sockets o named pipes. </li></ul><ul><li>Librerías ODBC, Connector/J, Connector/NET, C, C++, Perl, PHP, Python, Ruby y Tcl. </li></ul><ul><li>Utilidades varias: mysqldump, mysqladmin, GUI... </li></ul><ul><li>2005 Oracle compró OY (InnoDB), 2006 Sleepycat (BerkeleyDB) </li></ul><ul><li>2008 Sun compró MySQL AB </li></ul>13
  6. 6. 3.23=>2000. Primera versión “masiva”. 4.0 => Unions 4.1 => Subqueries, R-Trees 5.0 => SPs, Views, Cursors, XA Transac, Triggers. (INNODB) 5.1 => Event Scheduler, Partitions, Storage Engine Plugins, Row-based replication. 6.0 => Falcon Engine
  7. 7. Algunos Usuarios <ul><li>Premios MySQL Application of the Year </li></ul><ul><li>YouTube, Adobe (2007) </li></ul><ul><li>Nokia, Flickr (2006) </li></ul><ul><li>CNET, Wikipedia, Friendster (2005 ) </li></ul>
  8. 8. Tip 20: User quotas
  9. 9. <ul><li>Acceso y passwords </li></ul><ul><li>mysql -u root -p <DB> </li></ul><ul><li>USE mysql; </li></ul><ul><ul><li>SHOW tables; </li></ul></ul><ul><ul><li>DESCRIBE user; </li></ul></ul><ul><ul><li>SELECT * FROM userG </li></ul></ul><ul><ul><li>UPDATE user SET Password = PASSWORD(“pepe”) WHERE User = 'root'; </li></ul></ul><ul><ul><li>FLUSH privileges; </li></ul></ul>Tip 20: User quotas
  10. 10. <ul><li>Crear usuarios </li></ul><ul><li>GRANT ALL PRIVILEGES ON *.* TO 'pepe'@'localhost' [ IDENTIFIED BY 'pepe_password' ] [ WITH GRANT OPTION ] </li></ul><ul><li>Privilegios por DB / Table </li></ul><ul><ul><ul><li>*.* => DB.TABLE </li></ul></ul></ul><ul><li>Host </li></ul><ul><ul><ul><li>'%' / '192.168.0.1/255.255.255.0' </li></ul></ul></ul>Tip 20: User quotas
  11. 11. Quota -> WITH MAX_QUERIES_PER_HOUR 20 -> MAX_UPDATES_PER_HOUR 10 -> MAX_CONNECTIONS_PER_HOUR 5 -> MAX_USER_CONNECTIONS 2; Tip 20: User quotas
  12. 12. Tip 19: Utilizar UTF8
  13. 13. Tip 19: Utilizar UTF8 <ul><li>UTF-8 es una de la codificaciones de UNICODE . </li></ul><ul><li>Utiliza a partir de 8bits por caracter y es compatible con ASCII. </li></ul><ul><li>Es muy utilizado en HTML y en XML. </li></ul><ul><li>Recomendado para nuevos proyectos </li></ul>
  14. 14. Tip 19: Utilizar UTF8 <ul><li>UTF-8 es una de la codificaciones de UNICODE . </li></ul><ul><li>Utiliza a partir de 8bits por caracter y es compatible con ASCII. </li></ul><ul><li>Es muy utilizado en HTML y en XML. </li></ul><ul><li>Recomendado para nuevos proyectos. </li></ul><ul><ul><li>CREATE DATABASE `test` CHARSET SET utf8; </li></ul></ul><ul><li>También configuación por tabla, por columna, y por conexión. </li></ul><ul><li>También en literales </li></ul><ul><ul><li>UPDATE t SET a = utf8'hola'; </li></ul></ul>
  15. 15. Tip 19: Utilizar UTF8 <ul><li>Para configurar una conexión para recibir resultados y enviar consultas en utf8: </li></ul><ul><ul><li>SET NAMES UTF8; </li></ul></ul><ul><li>Hay también variables de configuración en el server </li></ul><ul><ul><li>default_character_set = utf8 </li></ul></ul><ul><ul><li>y más... </li></ul></ul>
  16. 16. Tip 18: Exportar CSV
  17. 17. Tip 18: Exportar CSV SELECT a,b,a+b INTO OUTFILE '/tmp/result.text' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '&quot;' LINES TERMINATED BY ' ' FROM test_table; <ul><li>CSV: Valores separados por coma. </li></ul><ul><li>Formato difundido ... y feo. </li></ul><ul><li>La salida quedará en el servidor. </li></ul>
  18. 18. Tip 17: Importar CSV
  19. 19. Tip 17: Importar CSV LOAD DATA [LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name FIELDS TERMINATED BY 'string'] LINES TERMINATED BY 'string' [IGNORE number LINES] [(col_name_or_user_var,...)]
  20. 20. Tip 16: Elegir correctamente el storage engine
  21. 21. Tip 16: Elegir correctamente el storage engine <ul><li>Los storage engines son diferentes implementaciones para el manejo de tablas. Cada uno tiene sus ventajas y desventajas y un esquema de tablas (DATABASE) puede combinar varios. </li></ul><ul><li>MyISAM : Es el original. No soporta transacciones, ni Fks. Es muy rápido y soporta Full Text Search. </li></ul><ul><li>MEMORY: 100% en memoria. Es más rápido. No soporta transacciónes. (Antes se llamaba HEAP). </li></ul><ul><li>InnoDB: Soporta transacciones y Fks. Es el más utilizado en Dbs que requieran Fks. Más lento que MyISAM. </li></ul><ul><li>NBD Cluster : Soporta tablas que distribuidas en varios servers. Sólo en distribuciones binarias. </li></ul><ul><li>ARCHIVE, CSV, BLACKHOLE, FEDERATED. </li></ul>
  22. 22. Tip 15: Investigar sobre los tipos de datos
  23. 23. <ul><li>ENUM </li></ul><ul><ul><li>Un string elegido entre un conjunto definido en la tabla, ordenado específicamente. </li></ul></ul><ul><ul><li>Máx de 64K elementos. </li></ul></ul><ul><ul><li>Puede insertarse como índice INSERT INTO t (numbers) VALUES (2),(”2”); </li></ul></ul><ul><ul><li>Se pueden ordenar (por índice) </li></ul></ul><ul><li>SET </li></ul><ul><ul><li>Similar a un enum, pero con muchos valores (<64, entre 64). </li></ul></ul><ul><ul><li>Por ejemplo (Provincias con sucursales). </li></ul></ul><ul><ul><li>Cada miembro es flag en una mascara de 64 bits. </li></ul></ul><ul><ul><li>El orden “no se guarda”. No puede haber repetidos. </li></ul></ul><ul><ul><li>{ col SET ('a','pepe','etc') } </li></ul></ul><ul><ul><li>INSERT INTO xx VALUES ('a'), ('a,pepe'), ('pepe,etc'), ('a,pepe,etc'); </li></ul></ul><ul><ul><li>WHERE FIND_IN_SET(col, “a”)>0; </li></ul></ul><ul><ul><li>Similar a user mascaras de bits, pero una interfase más amigable. </li></ul></ul>Tip 15: Investigar sobre los tipos de datos
  24. 24. Tip 14: Operadores propietarios
  25. 25. <ul><li>Comparación </li></ul><ul><ul><li>[NOT] BETWEEN ... AND ... </li></ul></ul><ul><ul><li><=>, =, >=, <=, <, >, <>, != </li></ul></ul><ul><ul><li>[NOT] IN (...) </li></ul></ul><ul><ul><li>IS NULL </li></ul></ul><ul><ul><li>LIKE, NOT LIKE, SOUNDS LIKE </li></ul></ul><ul><li>Retornan 1, 0, ó NULL </li></ul><ul><ul><li>COALESCE (...) </li></ul></ul><ul><ul><li>GREATEST(...), LEAST (...) </li></ul></ul>Tip 14: Operadores propietarios
  26. 26. Tip 13: Operadores de control de flujo
  27. 27. <ul><ul><li>CASE . </li></ul></ul><ul><ul><ul><ul><ul><li>SELECT CASE @a WHEN 1 THEN “VALE UNO” WHEN 2 THEN “VALE DOS” ELSE “VALE OTRA COSA” END; </li></ul></ul></ul></ul></ul><ul><ul><ul><li>IF . </li></ul></ul></ul><ul><ul><ul><ul><ul><li>IF (@a>10,”VALE MAS QUE 10”, “VALE MENOS QUE 10”); </li></ul></ul></ul></ul></ul><ul><ul><ul><li>IFNULL . </li></ul></ul></ul><ul><ul><ul><ul><ul><li>SELECT IFNULL(@a,”0”); /* BUENO PARA VALORES X DFLT */ </li></ul></ul></ul></ul></ul><ul><ul><ul><li>NULLIF . </li></ul></ul></ul><ul><ul><ul><ul><ul><ul><li>SELECT NULLIF(1,1); </li></ul></ul></ul></ul></ul></ul>Tip 13: Operadores de control de flujo
  28. 28. Tip 12: Operadores de Strings
  29. 29. <ul><ul><li>CHAR(), CONV() </li></ul></ul><ul><ul><ul><li>CONCAT, CONCAT_WS </li></ul></ul></ul><ul><ul><ul><li>ELT(n,str1,str2...), FIELD(str,str1,str2...) </li></ul></ul></ul><ul><ul><ul><li>EXPORT_SET(5,”Y”,”N”), FIND_IN_SET(“b”,”a,b,c,d”) ->2 </li></ul></ul></ul><ul><ul><ul><li>INSERT(), REPLACE(), INSTR(), LOCATE(), TRIM, RTRIM, LTRIM, MID </li></ul></ul></ul><ul><ul><ul><li><=>,=,<, ... </li></ul></ul></ul><ul><ul><ul><li>LENGTH, CHARACTER_LENGTH </li></ul></ul></ul><ul><ul><ul><li>LCASE, UCASE </li></ul></ul></ul><ul><ul><ul><li>LOAD_FILE('') </li></ul></ul></ul><ul><ul><ul><li>NOT REGEXP, REGEXP, RLIKE (no UTF8!) </li></ul></ul></ul>Tip 12: Operadores de Strings
  30. 30. Tip 11: Operadores de Fecha
  31. 31. <ul><ul><li>Date (abr.) </li></ul></ul><ul><ul><ul><li>UNIX_TIMESTAMP(), FROM_UNIXTIME() </li></ul></ul></ul><ul><ul><ul><li>SECOND(), HOUR(), DAY(), WEEK(), MONTH(), YEARWEEK(), DAYOFWEEK()... </li></ul></ul></ul><ul><ul><ul><li>NOW(), CURDATE(), CURTIME() </li></ul></ul></ul><ul><ul><ul><li>PERIOD_ADD, PERIOD_DIFF; TIMESTAMP_ADD, TIMESTAMPDIFF, ADDTIME </li></ul></ul></ul><ul><ul><ul><li>DATE_FORMAT </li></ul></ul></ul>Tip 11: Operadores de Fecha
  32. 32. Tip 10: Fulltext search
  33. 33. <ul><ul><li>Sólo para tablas MySQL. </li></ul></ul><ul><ul><li>Para InnoDB? Tablas “paralelas” </li></ul></ul><ul><ul><li>SELECT * FROM articles WHERE MATCH(title,body) AGAINST ('mysql'); </li></ul></ul><ul><ul><li>SELECT * FROM articles WHERE MATCH(title,body) AGAINST ('+mysql -oracle' IN BOOLEAN MODE); </li></ul></ul>Tip 10: Fulltext search
  34. 34. Tip 9: Foreign keys
  35. 35. ALTER TABLE t ADD ... [CONSTRAINT symbol] FOREIGN KEY [id](index_col_name, ...) REFERENCES tbl_name (index_col_name, ...) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}] Tip 9: Foreign keys
  36. 36. Tip 8: Subqueries
  37. 37. <ul><li>Escalares </li></ul><ul><ul><ul><li>SELECT 1,(SELECT 2); </li></ul></ul></ul><ul><ul><ul><li>SELECT a from t WHERE b > (SELECT ... ) ; </li></ul></ul></ul><ul><li>ANY|IN|SOME </li></ul><ul><ul><ul><li>IN es equivalente a = ANY </li></ul></ul></ul><ul><ul><ul><li>SELECT a FROM t WHERE id IN (SELECT id from t2); </li></ul></ul></ul><ul><ul><ul><li>SOME es equivalente a ANY </li></ul></ul></ul><ul><ul><ul><li>SELECT a FROM t WHERE id = SOME (SELECT id from t2); </li></ul></ul></ul><ul><li>ALL </li></ul><ul><ul><ul><li>SELECT a FROM t WHERE b > ALL (SELECT ...) </li></ul></ul></ul>Tip 8: Subqueries
  38. 38. Tip 7: Procedimentos
  39. 39. mysql> delimiter // mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) -> BEGIN -> SELECT COUNT(*) INTO param1 FROM t; -> END; -> // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> CALL simpleproc(@a); Query OK, 0 rows affected (0.00 sec) mysql> SELECT @a; Tip 7: Procedimentos
  40. 40. <ul><li>DECLARE var_name[, ...] type [DEFAULT xxx]; </li></ul><ul><li>SET var_name = XX[, ... ]; </li></ul><ul><li>SELECT col1[, col2 ... ] INTO var1[,var2 ...] [FROM xxx] </li></ul>CREATE PROCEDURE sp1 (x VARCHAR(5)) BEGIN DECLARE xname VARCHAR(5) DEFAULT 'bob'; DECLARE newname VARCHAR(5); DECLARE xid INT; SELECT xname,id INTO newname,xid FROM table1 WHERE xname = xname; SELECT newname; END; Tip 7: Procedimentos
  41. 41. <ul><li>IF </li></ul><ul><ul><ul><li>IF in_id > 1 THEN SELECT name INTO b FROM user where id = in_id; END IF; </li></ul></ul></ul><ul><li>CASE </li></ul><ul><li>LOOP </li></ul><ul><ul><ul><li>LOOP xx END LOOP; </li></ul></ul></ul><ul><li>LEAVE (=last, =break) </li></ul><ul><li>ITERATE (=next, =continue) </li></ul><ul><li>REPEAT (REPEAT xxxx UNTIL yyy END REPEAT) </li></ul><ul><li>WHILE (WHILE yyyy DO xxxx END WHILE;) </li></ul>Tip 7: Procedimentos
  42. 42. Tip 6: Handlers
  43. 43. DECLARE condition_name CONDITION FOR condition_value condition_value: SQLSTATE [VALUE] sqlstate_value | mysql_error_code DECLARE handler_type HANDLER FOR condition_value[,...] statement handler_type: CONTINUE | EXIT | UNDO condition_value: SQLSTATE [VALUE] sqlstate_value | condition_name | SQLWARNING | NOT FOUND | SQLEXCEPTION | mysql_error_code DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1; Tip 6: Handlers
  44. 44. Tip 5: Cursores
  45. 45. CREATE PROCEDURE curdemo() BEGIN DECLARE done INT DEFAULT 0; DECLARE a CHAR(16); DECLARE b,c INT; DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1; DECLARE cur2 CURSOR FOR SELECT i FROM test.t2; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; OPEN cur1; OPEN cur2; REPEAT FETCH cur1 INTO a, b; FETCH cur2 INTO c; IF NOT done THEN IF b < c THEN INSERT INTO test.t3 VALUES (a,b); ELSE INSERT INTO test.t3 VALUES (a,c); END IF; END IF; UNTIL done END REPEAT; CLOSE cur1; CLOSE cur2; END Tip 5: Cursores
  46. 46. Tip 4: Triggers
  47. 47. <ul><li>Es un objeto asociado a una tabla. </li></ul><ul><li>Se activa por un evento, generado por un statement (por ejempl o: INSERT) </li></ul><ul><li>Son muy útiles para manter coherencia, actualzar caches, notificaciones, etc. </li></ul>Tip 4: Triggers
  48. 48. <ul><li>CREATE [DEFINER = xx] TRIGGER name time event ON table FOR EACH ROW statements; </li></ul><ul><li>time: BEFORE ó AFTER </li></ul><ul><li>event: INSERT, UPDATE, DELETE </li></ul><ul><li>DROP TRIGGER [if exists] name; </li></ul><ul><li>BEFORE ocurre antes de la comprobación de Fks, etc. Típicamente se usa para preparar ciertos campos de NEW. </li></ul><ul><li>AFTER ocurre luego del insert/update. Puede cosultar el ID! (la fila ya existe). </li></ul>Tip 4: Triggers
  49. 49. <ul><li>NEW. y OLD. </li></ul>DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; | Tip 4: Triggers
  50. 50. Tip 3: Views
  51. 51. <ul><li>ALTER VIEW / CREATE VIEW / DROP VIEW </li></ul><ul><li>No puede tener subqueries </li></ul><ul><li>No puede usar variables ni parámetros (!) </li></ul><ul><li>No puede tener triggers </li></ul><ul><li>Algunas Views son modificables (insert, update) </li></ul><ul><ul><li>1 a 1 </li></ul></ul><ul><ul><li>Sin funciones agregadoras/group/distinct/union etc. </li></ul></ul>Tip 3: Views
  52. 52. CREATE VIEW test.v AS SELECT * FROM t; CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t; CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 0 Tip 3: Views
  53. 53. Tip 2: Replicación
  54. 54. <ul><li>Permite replicar los datos de 1 Master a 1 o más slaves. </li></ul><ul><li>La replicación es asincrónica. </li></ul><ul><li>Para qué? </li></ul><ul><ul><li>Performance y escalabilidad </li></ul></ul><ul><ul><li>Seguridad (backup sobre el slave) </li></ul></ul><ul><ul><li>Análisis (en el slave, sin alterar el master) </li></ul></ul><ul><ul><li>Local copies </li></ul></ul>Tip 2: Replicación
  55. 55. <ul><li>Scaleout </li></ul>Tip 2: Replicación
  56. 56. <ul><li>Redundancy </li></ul>Tip 2: Replicación
  57. 57. <ul><li>Es asincrónica (sino NDB Engine: Incluso data distribuida!). </li></ul><ul><li>Esta basada en el binlog: Historial de modificaciones a la base. </li></ul><ul><li>Los slave toman el binlog del master y lo reproducen. </li></ul><ul><li>El master no “replica”. Son los slaves que toman la info. </li></ul><ul><li>Puede filtrarse db/tables en los slaves. </li></ul><ul><li>Cada nodo debe tener un único server-id. Puede cambiarse con CHANGE MASTER. </li></ul><ul><li>binlog vs. relaylog </li></ul>Tip 2: Replicación
  58. 58. Tip 1: SQL_FOUND_ROWS
  59. 59. <ul><li>SELECT a WHERE x,y,z ... LIMIT 10; </li></ul><ul><ul><li>=> 10 resultados </li></ul></ul><ul><li>PAGER ? </li></ul><ul><ul><li>SELECT count(*) .... </li></ul></ul><ul><li>SELECT SQL_CALC_FOUND_ROWS a WHERE x,y,z... LIMIT 10; </li></ul><ul><ul><li>SELECT FOUND_ROWS(); </li></ul></ul>Tip 1: SQL_CALC_FOUND_ROWS
  60. 60. Tip 1b: REPLACE/DUP
  61. 61. <ul><li>INSERT INTO t (nombre,telefono) VALUES ('pepe','4321-1234'); </li></ul><ul><ul><li>Falla si `pepe` ya existe y es una UNIQUE KEY </li></ul></ul><ul><li>SET @a=SELECT ROW_COUNT(); </li></ul><ul><li>IF @a=0 THEN UPDATE t SET telefono='4321-1234' where id = 'pepe'; </li></ul>Tip 1b: REPLACE/DUP
  62. 62. <ul><li>INSERT REPLACE INTO t (nombre,telefono) VALUES ('pepe','4321-1234'); </li></ul><ul><ul><li>Falla si `pepe` ya existe y es una UNIQUE KEY, hace un update. </li></ul></ul><ul><li>Problema si hay muchas UNIQUES. </li></ul>Tip 1b: REPLACE/DUP
  63. 63. <ul><li>ON DUPLICATE KEY </li></ul><ul><li>INSERT INTO t (nombre,telefono) VALUES ('pepe','4321-1234') ON DUPLICATE KEY UPDATE telefono = '4321-1234'; </li></ul><ul><ul><li>INSERT INTO t (nombre,visitas) VALUES ('pepe',@a) ON DUPLICATE KEY UPDATE visitas = visitas + value(visitas); </li></ul></ul>Tip 1b: REPLACE/DUP
  64. 64. Tip 0: Probar Tip 0: Probar Tip 0: Probar
  65. 65. Próximas versiones
  66. 66. <ul><li>5.1 </li></ul><ul><li>Patitioning (porciones de tablas en diferentes FSs) </li></ul><ul><li>Row based-replication (was statement based) </li></ul><ul><li>Plugins </li></ul><ul><li>Triggers on time </li></ul><ul><li>XML: ExtractValue </li></ul>
  67. 67. <ul><li>6.0 </li></ul><ul><li>Falcon Engine </li></ul><ul><li>BACKUP / RESTORE desde SQL </li></ul><ul><li>Mejoras en INFORMATION_SCHEMA </li></ul><ul><li>Mejoras en optimizador de INNODB / MYISAM </li></ul><ul><li>XML: Load XML </li></ul>
  68. 68. ¡Muchas Gracias!

×