Charla Mysql
Upcoming SlideShare
Loading in...5
×
 

Charla Mysql

on

  • 4,738 views

 

Statistics

Views

Total Views
4,738
Views on SlideShare
4,500
Embed Views
238

Actions

Likes
1
Downloads
89
Comments
0

6 Embeds 238

http://blog.matiu.com.ar 184
http://antoniocanchila.blogspot.com 31
http://www.slideshare.net 9
http://www.antoniocanchila.blogspot.com 7
http://www.linkedin.com 5
https://www.linkedin.com 2

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Charla Mysql Charla Mysql Presentation Transcript

    • MySQL Avanzado
    • Jornadas Regionales de Software Libre 2008
    • Ing. Matías Alejo García
    • [email_address]
      • Confronte.com
      • UADE
    • MySQL Avanzado
    • 20 Trucos para MySQL
    • Jornadas Regionales de Software Libre 2008
    • Ing. Matías Alejo García
    • [email_address]
      • Confronte.com
      • UADE
    • Agenda
    • Historia y versiones
    • 20 trucos y consejos para MySQL
    • 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.
    • Diferentes “Storage engines”.
    • Casos de 60000 tablas, 5000mill filas.
    • Hasta 64 índices por tabla. (767/1000 bytes por índice)
    • Conexión por TCP Sockets / UNIX Sockets o named pipes.
    • Librerías 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
  • 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
  • Algunos Usuarios
    • Premios MySQL Application of the Year
    • YouTube, Adobe (2007)
    • Nokia, Flickr (2006)
    • CNET, Wikipedia, Friendster (2005 )
  • Tip 20: User quotas
    • Acceso y passwords
    • mysql -u root -p <DB>
    • USE mysql;
      • SHOW tables;
      • DESCRIBE user;
      • SELECT * FROM userG
      • UPDATE user SET Password = PASSWORD(“pepe”) WHERE User = 'root';
      • FLUSH privileges;
    Tip 20: User quotas
    • Crear usuarios
    • GRANT ALL PRIVILEGES ON *.* 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
  • 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
  • Tip 19: Utilizar UTF8
  • Tip 19: Utilizar UTF8
    • UTF-8 es 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 para nuevos proyectos
  • Tip 19: Utilizar UTF8
    • UTF-8 es 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 para nuevos proyectos.
      • CREATE DATABASE `test` CHARSET SET utf8;
    • También configuación por tabla, por columna, y por conexión.
    • También en literales
      • UPDATE t SET a = utf8'hola';
  • Tip 19: Utilizar UTF8
    • Para configurar una conexión para recibir resultados y enviar consultas en utf8:
      • SET NAMES UTF8;
    • Hay también variables de configuración en el server
      • default_character_set = utf8
      • y más...
  • Tip 18: Exportar CSV
  • 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;
    • CSV: Valores separados por coma.
    • Formato difundido ... y feo.
    • La salida quedará en el servidor.
  • Tip 17: Importar CSV
  • 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,...)]
  • Tip 16: Elegir correctamente el storage engine
  • Tip 16: Elegir correctamente el storage engine
    • 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.
    • MyISAM : Es el original. No soporta transacciones, ni Fks. Es muy rápido y soporta Full Text Search.
    • MEMORY: 100% en memoria. Es más rápido. No soporta transacciónes. (Antes se llamaba HEAP).
    • InnoDB: Soporta transacciones y Fks. Es el más utilizado en Dbs que requieran Fks. Más lento que MyISAM.
    • NBD Cluster : Soporta tablas que distribuidas en varios servers. Sólo en distribuciones binarias.
    • ARCHIVE, CSV, BLACKHOLE, FEDERATED.
  • Tip 15: Investigar sobre los tipos de datos
    • ENUM
      • Un string elegido entre un conjunto definido en la tabla, ordenado específicamente.
      • Máx 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 (<64, entre 64).
      • Por ejemplo (Provincias con sucursales).
      • Cada miembro es flag en una mascara de 64 bits.
      • El orden “no se guarda”. No puede haber repetidos.
      • { col SET ('a','pepe','etc') }
      • INSERT INTO xx VALUES ('a'), ('a,pepe'), ('pepe,etc'), ('a,pepe,etc');
      • WHERE FIND_IN_SET(col, “a”)>0;
      • Similar a user mascaras de bits, pero una interfase más amigable.
    Tip 15: Investigar sobre los tipos de datos
  • Tip 14: Operadores propietarios
    • Comparación
      • [NOT] BETWEEN ... AND ...
      • <=>, =, >=, <=, <, >, <>, !=
      • [NOT] IN (...)
      • IS NULL
      • LIKE, NOT LIKE, SOUNDS LIKE
    • Retornan 1, 0, ó NULL
      • COALESCE (...)
      • GREATEST(...), LEAST (...)
    Tip 14: Operadores propietarios
  • Tip 13: Operadores de control de flujo
      • CASE .
            • SELECT CASE @a WHEN 1 THEN “VALE UNO” WHEN 2 THEN “VALE DOS” ELSE “VALE OTRA COSA” END;
        • IF .
            • IF (@a>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
  • Tip 12: Operadores de Strings
      • 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
        • <=>,=,<, ...
        • LENGTH, CHARACTER_LENGTH
        • LCASE, UCASE
        • LOAD_FILE('')
        • NOT REGEXP, REGEXP, RLIKE (no UTF8!)
    Tip 12: Operadores de Strings
  • Tip 11: Operadores de Fecha
      • Date (abr.)
        • UNIX_TIMESTAMP(), FROM_UNIXTIME()
        • SECOND(), HOUR(), DAY(), WEEK(), MONTH(), YEARWEEK(), DAYOFWEEK()...
        • NOW(), CURDATE(), CURTIME()
        • PERIOD_ADD, PERIOD_DIFF; TIMESTAMP_ADD, TIMESTAMPDIFF, ADDTIME
        • DATE_FORMAT
    Tip 11: Operadores de Fecha
  • Tip 10: Fulltext search
      • Sólo para tablas MySQL.
      • Para InnoDB? Tablas “paralelas”
      • SELECT * FROM articles WHERE MATCH(title,body) AGAINST ('mysql');
      • SELECT * FROM articles WHERE MATCH(title,body) AGAINST ('+mysql -oracle' IN BOOLEAN MODE);
    Tip 10: Fulltext search
  • Tip 9: Foreign keys
  • 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
  • Tip 8: Subqueries
    • Escalares
        • SELECT 1,(SELECT 2);
        • SELECT a from t WHERE b > (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
  • Tip 7: Procedimentos
  • 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
    • 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,xid FROM table1 WHERE xname = xname; SELECT newname; END; Tip 7: Procedimentos
    • IF
        • IF in_id > 1 THEN SELECT name INTO b FROM user where id = in_id; END IF;
    • CASE
    • LOOP
        • LOOP xx 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
  • Tip 6: Handlers
  • 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
  • Tip 5: Cursores
  • 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
  • Tip 4: Triggers
    • 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
    • CREATE [DEFINER = xx] TRIGGER name time event ON table FOR EACH ROW statements;
    • time: BEFORE ó AFTER
    • event: INSERT, UPDATE, DELETE
    • DROP TRIGGER [if exists] name;
    • BEFORE ocurre antes de la comprobación de Fks, etc. Típicamente 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
    • 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
  • Tip 3: Views
    • ALTER VIEW / CREATE VIEW / DROP VIEW
    • No puede tener subqueries
    • No puede usar variables ni parámetros (!)
    • No puede tener triggers
    • Algunas Views son modificables (insert, update)
      • 1 a 1
      • Sin funciones agregadoras/group/distinct/union etc.
    Tip 3: Views
  • 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
  • Tip 2: Replicación
    • Permite replicar los datos de 1 Master a 1 o más slaves.
    • La replicación es asincrónica.
    • Para qué?
      • Performance y escalabilidad
      • Seguridad (backup sobre el slave)
      • Análisis (en el slave, sin alterar el master)
      • Local copies
    Tip 2: Replicación
    • Scaleout
    Tip 2: Replicación
    • Redundancy
    Tip 2: Replicación
    • Es asincrónica (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 único server-id. Puede cambiarse con CHANGE MASTER.
    • binlog vs. relaylog
    Tip 2: Replicación
  • Tip 1: SQL_FOUND_ROWS
    • 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
  • Tip 1b: REPLACE/DUP
    • 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
    • INSERT REPLACE 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
    • 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
  • Tip 0: Probar Tip 0: Probar Tip 0: Probar
  • Próximas versiones
    • 5.1
    • Patitioning (porciones de tablas en diferentes FSs)
    • Row based-replication (was statement based)
    • Plugins
    • Triggers on time
    • XML: ExtractValue
    • 6.0
    • Falcon Engine
    • BACKUP / RESTORE desde SQL
    • Mejoras en INFORMATION_SCHEMA
    • Mejoras en optimizador de INNODB / MYISAM
    • XML: Load XML
  • ¡Muchas Gracias!