Charla Mysql

download Charla Mysql

If you can't read please download the document

Transcript of Charla Mysql

  • 1.
    • MySQL Avanzado
  • Jornadas Regionales de Software Libre 2008
  • Ing. Matas Alejo Garca
  • [email_address]
    • Confronte.com
    • UADE

2.

  • MySQL Avanzado
  • 20 Trucos para MySQL
  • Jornadas Regionales de Software Libre 2008
  • Ing. Matas Alejo Garca
  • [email_address]
    • Confronte.com
    • UADE

3.

  • Agenda
  • Historia y versiones
  • 20 trucos y consejos para MySQL

4.

  • Multi-thread, multi-user, robust SQL server.
  • MYSQL AB. Primera version 1995.
  • Mission critical, heavy load production server.
  • Dos licencias GNU GPL y Comercial.
  • Escrito en C y C++.
  • Open Source. Comunidad muy activa. 10 mill de instalaciones.
  • MaxDB es otro proyecto de MYSQL AB.
  • ANSI SQL / ODBC SQL. SQL99.

5.

  • Diferentes Storage engines.
  • Casos de 60000 tablas, 5000mill filas.
  • Hasta 64 ndices por tabla. (767/1000 bytes por ndice)
  • Conexin por TCP Sockets / UNIX Sockets o named pipes.
  • Libreras ODBC, Connector/J, Connector/NET, C, C++, Perl, PHP, Python, Ruby y Tcl.
  • Utilidades varias: mysqldump, mysqladmin, GUI...
  • 2005 Oracle compr OY (InnoDB), 2006 Sleepycat (BerkeleyDB)
  • 2008 Sun compr MySQL AB

13 6. 3.23=>2000. Primera versin 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. Algunos Usuarios

  • PremiosMySQL Application of the Year
  • YouTube, Adobe (2007)
  • Nokia, Flickr (2006)
  • CNET, Wikipedia, Friendster (2005 )

8. Tip 20: User quotas 9.

  • Acceso y passwords
  • mysql -u root -p
  • USE mysql;
    • SHOW tables;
    • DESCRIBE user;
    • SELECT * FROM userG
    • UPDATE user SET Password = PASSWORD(pepe) WHERE User = 'root';
    • FLUSH privileges;

Tip 20: User quotas 10.

  • Crear usuarios
  • GRANT ALL PRIVILEGESON *.*TO 'pepe'@'localhost'[ IDENTIFIED BY 'pepe_password' ] [ WITH GRANT OPTION ]
  • Privilegios por DB / Table
      • *.* => DB.TABLE
  • Host
      • '%' / '192.168.0.1/255.255.255.0'

Tip 20: User quotas 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. Tip 19: Utilizar UTF8 13. Tip 19: Utilizar UTF8

  • UTF-8es una de la codificaciones de UNICODE .
  • Utiliza a partir de 8bits por caracter y es compatible con ASCII.
  • Es muy utilizado en HTML y en XML.
  • Recomendado paranuevosproyectos

14. Tip 19: Utilizar UTF8

  • UTF-8es una de la codificaciones de UNICODE .
  • Utiliza a partir de 8bits por caracter y es compatible con ASCII.
  • Es muy utilizado en HTML y en XML.
  • Recomendado paranuevosproyectos.
    • CREATE DATABASE `test` CHARSET SET utf8;
  • Tambin configuacin por tabla, por columna, y por conexin.
  • Tambin en literales
    • UPDATE t SET a = utf8'hola';

15. Tip 19: Utilizar UTF8

  • Para configurar una conexin para recibir resultados y enviar consultas en utf8:
    • SET NAMES UTF8;
  • Hay tambin variables de configuracin en el server
    • default_character_set = utf8
    • y ms...

16. Tip 18: Exportar CSV 17. Tip 18: Exportar CSV SELECT a,b,a+b INTO OUTFILE '/tmp/result.text'FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'LINES TERMINATED BY ' 'FROM test_table;

  • CSV: Valores separados por coma.
  • Formato difundido ... y feo.
  • La salida quedar en el servidor.

18. Tip 17: Importar CSV 19. Tip 17: Importar CSV LOAD DATA[LOCAL] INFILE 'file_name' [REPLACE | IGNORE] INTO TABLE tbl_name FIELDSTERMINATED BY 'string']LINES TERMINATED BY 'string' [IGNORE number LINES] [(col_name_or_user_var,...)] 20. Tip 16: Elegir correctamente el storage engine 21. Tip 16: Elegir correctamente el storage engine

  • Losstorage enginesson diferentes implementaciones para el manejo de tablas. Cada uno tiene sus ventajas y desventajas y un esquema de tablas (DATABASE) puede combinar varios.
  • MyISAM : Es el original. No soporta transacciones, ni Fks. Es muy rpido y soporta Full Text Search.
  • MEMORY:100% en memoria. Es ms rpido. No soporta transaccines. (Antes se llamaba HEAP).
  • InnoDB:Soporta transacciones y Fks. Es el ms utilizado en Dbs que requieran Fks. Ms lento que MyISAM.
  • NBD Cluster : Soporta tablas que distribuidas en varios servers. Slo en distribuciones binarias.
  • ARCHIVE, CSV, BLACKHOLE, FEDERATED.

22. Tip 15: Investigar sobre los tipos de datos 23.

  • ENUM
    • Un string elegido entre un conjunto definido en la tabla, ordenado especficamente.
    • Mx de 64K elementos.
    • Puede insertarse como ndice INSERT INTO t (numbers) VALUES (2),(2);
    • Se pueden ordenar (por ndice)
  • SET
    • Similar a un enum, pero con muchos valores (0;
    • Similar a user mascaras de bits, pero una interfase ms amigable.

Tip 15: Investigar sobre los tipos de datos 24. Tip 14: Operadores propietarios 25.

  • Comparacin
    • [NOT]BETWEEN ... AND ...
    • , =, >=, 10,VALE MAS QUE 10, VALE MENOS QUE 10);
      • IFNULL .
          • SELECT IFNULL(@a,0);/* BUENO PARA VALORES X DFLT */
      • NULLIF .
            • SELECT NULLIF(1,1);

Tip 13: Operadores de control de flujo 28. Tip 12: Operadores de Strings 29.

    • CHAR(), CONV()
      • CONCAT, CONCAT_WS
      • ELT(n,str1,str2...), FIELD(str,str1,str2...)
      • EXPORT_SET(5,Y,N), FIND_IN_SET(b,a,b,c,d) ->2
      • INSERT(), REPLACE(), INSTR(), LOCATE(), TRIM, RTRIM, LTRIM, MID
      • ,=, (SELECT ... ) ;
  • ANY|IN|SOME
      • IN es equivalente a = ANY
      • SELECT a FROM t WHERE id IN (SELECT id from t2);
      • SOME es equivalente a ANY
      • SELECT a FROM t WHERE id = SOME (SELECT id from t2);
  • ALL
      • SELECT a FROM t WHERE b > ALL (SELECT ...)

Tip 8: Subqueries 38. Tip 7: Procedimentos 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.

  • DECLARE var_name[, ...] type [DEFAULT xxx];
  • SET var_name = XX[, ... ];
  • SELECT col1[, col2 ... ] INTO var1[,var2 ...] [FROM xxx]

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,xidFROM table1 WHERE xname = xname; SELECT newname; END; Tip 7: Procedimentos 41.

  • IF
      • IF in_id >1 THENSELECT name INTO b FROM user where id = in_id;END IF;
  • CASE
  • LOOP
      • LOOPxx END LOOP;
  • LEAVE (=last, =break)
  • ITERATE (=next, =continue)
  • REPEAT(REPEAT xxxx UNTIL yyy END REPEAT)
  • WHILE(WHILE yyyy DO xxxx END WHILE;)

Tip 7: Procedimentos 42. Tip 6: Handlers 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. Tip 5: Cursores 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. Tip 4: Triggers 47.

  • Es un objeto asociado a una tabla.
  • Se activa por un evento, generado por un statement (por ejempl o: INSERT)
  • Son muy tiles para manter coherencia, actualzar caches, notificaciones, etc.

Tip 4: Triggers 48.

  • CREATE [DEFINER = xx] TRIGGER nametime eventON table FOR EACH ROW statements;
  • time: BEFORE AFTER
  • event: INSERT, UPDATE, DELETE
  • DROP TRIGGER [if exists] name;
  • BEFORE ocurre antes de la comprobacin de Fks, etc. Tpicamente se usa para preparar ciertos campos de NEW.
  • AFTER ocurre luego del insert/update. Puede cosultar el ID! (la fila ya existe).

Tip 4: Triggers 49.

  • NEW. y OLD.

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. Tip 3: Views 51.

  • ALTER VIEW / CREATE VIEW / DROP VIEW
  • No puede tener subqueries
  • No puede usar variables ni parmetros (!)
  • No puede tener triggers
  • Algunas Views son modificables (insert, update)
    • 1 a 1
    • Sin funciones agregadoras/group/distinct/union etc.

Tip 3: Views 52. CREATE VIEW test.v AS SELECT * FROM t; CREATE VIEW v ASSELECT qty, price, qty*price AS valueFROM t; CREATE VIEW v2 ASSELECT *FROM v1WHERE a > 0 Tip 3: Views 53. Tip 2: Replicacin 54.

  • Permite replicar los datos de 1 Master a 1 o ms slaves.
  • La replicacin es asincrnica.
  • Para qu?
    • Performance y escalabilidad
    • Seguridad (backup sobre el slave)
    • Anlisis (en el slave, sin alterar el master)
    • Local copies

Tip 2: Replicacin 55.

  • Scaleout

Tip 2: Replicacin 56.

  • Redundancy

Tip 2: Replicacin 57.

  • Es asincrnica (sino NDB Engine: Incluso data distribuida!).
  • Esta basada en el binlog: Historial de modificaciones a la base.
  • Los slave toman el binlog del master y lo reproducen.
  • El master no replica. Son los slaves que toman la info.
  • Puede filtrarse db/tables en los slaves.
  • Cada nodo debe tener un nicoserver-id.Puede cambiarse con CHANGE MASTER.
  • binlog vs. relaylog

Tip 2: Replicacin 58. Tip 1: SQL_FOUND_ROWS 59.

  • SELECT a WHERE x,y,z ... LIMIT 10;
    • => 10 resultados
  • PAGER ?
    • SELECT count(*) ....
  • SELECT SQL_CALC_FOUND_ROWS a WHERE x,y,z... LIMIT 10;
    • SELECT FOUND_ROWS();

Tip 1: SQL_CALC_FOUND_ROWS 60. Tip 1b: REPLACE/DUP 61.

  • INSERT INTO t (nombre,telefono)VALUES ('pepe','4321-1234');
    • Falla si `pepe` ya existe y es una UNIQUE KEY
  • SET @a=SELECT ROW_COUNT();
  • IF @a=0 THEN UPDATE t SET telefono='4321-1234'where id = 'pepe';

Tip 1b: REPLACE/DUP 62.

  • INSERTREPLACE INTO t (nombre,telefono)VALUES ('pepe','4321-1234');
    • Falla si `pepe` ya existe y es una UNIQUE KEY, hace un update.
  • Problema si hay muchas UNIQUES.

Tip 1b: REPLACE/DUP 63.

  • ON DUPLICATE KEY
  • INSERT INTO t (nombre,telefono)VALUES ('pepe','4321-1234') ON DUPLICATE KEY UPDATE telefono = '4321-1234';
    • INSERT INTO t (nombre,visitas)VALUES ('pepe',@a) ON DUPLICATE KEY UPDATE visitas = visitas+ value(visitas);

Tip 1b: REPLACE/DUP 64. Tip 0: Probar Tip 0: Probar Tip 0: Probar 65. Prximas versiones 66.

  • 5.1
  • Patitioning (porciones de tablas en diferentes FSs)
  • Row based-replication (was statement based)
  • Plugins
  • Triggers on time
  • XML: ExtractValue

67.

  • 6.0
  • Falcon Engine
  • BACKUP / RESTORE desde SQL
  • Mejoras en INFORMATION_SCHEMA
  • Mejoras en optimizador de INNODB / MYISAM
  • XML: Load XML

68. Muchas Gracias!