Notiuni avansate MySQL - Infoeducatie 2009

30
Noţiuni avansate MySQL

description

MySql este una dintre cele mai folosite baze de date Open Source. A fost gandita pentru web si este folosita cu succes pentru a scala. Google, Wikipedia, Facebook, Amazon, Flickr si multi altii o folosesc. Dintre subiectele pe care le vom atinge: tipuri de tabele, indecsi, foreign key-uri, subquery-uri, tabele temporare, triggere, view-uri, join-uri, notiuni de proceduri stocate si multe altele. La fiecare pas voi prezenta exemple pentru a demonstra facilitatile prezentate.

Transcript of Notiuni avansate MySQL - Infoeducatie 2009

Page 1: Notiuni avansate MySQL - Infoeducatie 2009

Noţiuni avansate MySQL

Page 2: Notiuni avansate MySQL - Infoeducatie 2009

Noţiuni avansate MySQL• MySQL• Arhitectura MySQL• Tabele• Tipuri de date• Indecşi• Foreign key-uri• Triggere• Proceduri stocate

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 01

• Views• Comenzi sql avansate• Join-uri• DESCRIBE• Slow query log• Query cache• Performanţă

Page 3: Notiuni avansate MySQL - Infoeducatie 2009

MySQL3.23 - vechi4.1x - stabil, puţine funcţionalităţi5.0x - GA5.1 - GA5.4 - RC 6.x - ?

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 02

Page 4: Notiuni avansate MySQL - Infoeducatie 2009

Arhitectura MySQL

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 03

Page 5: Notiuni avansate MySQL - Infoeducatie 2009

TabeleTipuri de tabele

• MyISAM• InnoDB• Memory / HEAP • MERGE, MRG_MyISAM• Black hole• CSV• ARCHIVE

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 04

CREATE TABLE t( columns) ENGINE = sau ALTER TABLE t ENGINE =

Page 6: Notiuni avansate MySQL - Infoeducatie 2009

Tipuri de date - intTINYINT 1byteSMALLINT 2BytesMEDIUMINT 3 bytesINT 4bytes

-2147483648 +2147483647BIGINT 8 bytes

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 05

Probleme comune

INT(4) – ZEROFILL – ex 0001

Page 7: Notiuni avansate MySQL - Infoeducatie 2009

Tipuri de date – dată şi timpDATETIME 2009-07-09 21:15:15DATE 2009-07-09TIMESTAMP la fel ca DATE dar în raza timestamp

de la 1 ian 1970 până în 2038

TIME 21:15:15

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 06

Page 8: Notiuni avansate MySQL - Infoeducatie 2009

Tipuri de date – şirCHAR - consumă spatiu fixVARCHAR - consumă spatiu în funcţie de lungime• 0-255 caractere• coloane cu encoding

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 07

BINARYVARBINARY

• date binare

TINYBLOB BLOB MEDIUMBLOB LONGBLOB

TINYTEXT TEXTMEDIUMTEXTLONGTEXT

Page 9: Notiuni avansate MySQL - Infoeducatie 2009

Tipuri de date – ENUM şi SETAtunci când lista de valori este fixăConsumă puţin spaţiu

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 08

CREATE TABLE oameni{id TINYINT PRIMARY KEY autoincrement,nume VARCHAR(25),sex ENUM('masculin','feminin')

}INSERT INTO oameni(nume,sex) VALUES('Ion

Popescu','masculin');CREATE TABLE newsletter{

id TINYINT PRIMARY KEY autoincrement,nume VARCHAR(25),categorie SET('evenimente','stiri','sport')

}INSERT INTO newsletter(nume,categorie) VALUES('Ion

Popescu','stiri,sport');

Page 10: Notiuni avansate MySQL - Infoeducatie 2009

Indecşi

• Ordonăm tabelul dupa 1 sau n coloane• Tipuri de indecşi

PRIMARY KEYIndexUniqueFull Text

• Tipuri de algoritmi : BTREE si HASH• Aplicate pe 1 sau mai multe coloane (multiple index)

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 09

CREATE INDEX i_name ON table_name(col1,col2,..)

Page 11: Notiuni avansate MySQL - Infoeducatie 2009

Full text indexCăutare în texte

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 10

SELECT id,titlu FROM table WHERE MATCH(titlu) AGAINST(‘xml’)

SELECT id,titlu FROM table WHERE MATCH(titlu) AGAINST(‘xml’ WITH QUERY EXPANSION)

Page 12: Notiuni avansate MySQL - Infoeducatie 2009

Foreign key

Exemplu : InnoDBSe pot adăuga la crearea tabelului sau ulterior

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 11

FOREIGN KEY(cat_id) REFERENCES cat(id)

Formează legăturile între tabele.Legături care la proiectare le formăm prin convenţie. Exemplu : news.cat_id – cat.id

Page 13: Notiuni avansate MySQL - Infoeducatie 2009

TriggereObiect asociat unui tabel care se apelează la unanumit eveniment

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 12

CREATE TRIGGER trig_name {BEFORE| AFTER} {INSERT,REPLACE,UPDATE, DELETE} on t

FOR EACH ROW BEGIN ..sql..END;

Page 14: Notiuni avansate MySQL - Infoeducatie 2009

Exemplu

CREATE TRIGGER updateCateg AFTER INSERT ONproduse FOR EACH ROW BEGIN UPDATE cats SET nr=nr+1 WHERE id=NEW.cat_id;

END;

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 13

Page 15: Notiuni avansate MySQL - Infoeducatie 2009

ViewsCREATE VIEW view_name AS [query]DROP VIEW view_name

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 14

CREATE VIEW stats_l AS SELECT l.id,l.nume, ( SELECT count( c.id ) FROM comentarii c WHERE c.lectie_id = l.id ) AS nr_comentarii , ( SELECT count( r.id ) FROM rezolvari r WHERE r.lectie_id = l.id ) AS nr_rezolvari FROM lectii l ORDER BY id ASC

SELECT * FROM stats_l

Page 16: Notiuni avansate MySQL - Infoeducatie 2009

Proceduri stocateSubrutine care se reţin în baza de date

Folosite pentru • A testa datele • A muta sql din logica aplicaţiei în db • A minimiza traficul dintre client şi db

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 15

Page 17: Notiuni avansate MySQL - Infoeducatie 2009

Exempludelimiter // DROP PROCEDURE IF EXISTS colavg// CREATE PROCEDURE colavg(IN tbl CHAR(64),IN col

CHAR(64))

READS SQL DATA COMMENT 'Selects the avg of column col in table tbl' BEGIN SET @s = CONCAT('SELECT AVG(' , col , ') FROM

' , tbl); PREPARE stmt FROM @s; EXECUTE stmt; END; // delimiter ;

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 16

CALL colavg('t_note','nota');

Page 18: Notiuni avansate MySQL - Infoeducatie 2009

GROUP BY

SELECT cat_id,count(id) FROM posts GROUP BY id

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 17

Numărul de post-uri din fiecare categorie.

Page 19: Notiuni avansate MySQL - Infoeducatie 2009

HAVING

SELECT cat_id,count(id) FROM posts GROUP BY id HAVING count(id)<=100

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 18

Numărul de post-uri din fiecare categorie care are mai puţin de 100 de elemente

Page 20: Notiuni avansate MySQL - Infoeducatie 2009

SubQuery-uriSELECT count(sum) FROM (SELECT nr AS sum FROM

cats WHERE cat_id=3);

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 19

SELECT lectii.nume,(SELECT count(id) FROM rezolvari WHERE lectii.id=rezolvari.lectie_id)AS nr FROM lectii;

Page 21: Notiuni avansate MySQL - Infoeducatie 2009

JOIN-uriJoin - produs cardinal între 2 tabele

- condiţie de join

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 20

SELECT camp1,camp2,.. FROM t1 [tip-join] t2 ON conditii [tip-join] t3ON conditii … [WHERE conditii]INNER JOIN

coloanele din stănga şi dreapta se adaugă dacă ambele respectă condiţia

LEFT JOINcoloana stângă se adaugă şi dreapta numai dacă respectă condiţia

RIGHT JOINcoloana dreaptă se adaugă şi stânga numai dacă respectă condiţia

Page 22: Notiuni avansate MySQL - Infoeducatie 2009

Exemple – INNER JOINSELECT elevi.id,comentarii.comentariu FROMelevi INNER JOIN comentarii ON elevi.id=comentarii.elev_id

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 21

SELECT elevi.id,comentarii.comentariu FROMelevi , comentarii WHERE elevi.id=comentarii.elev_id

SELECT e.id,c.comentariu FROMelevi e INNER JOIN comentarii c ON e.id=c.elev_id

Page 23: Notiuni avansate MySQL - Infoeducatie 2009

LEFT JOIN

Selectează toţi elevii pe coloana din stânga şipe cea din dreapta comentarii, dacă există

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 22

SELECT e.username,c.comentariu FROMelevi e LEFT JOIN comentarii c ON e.id=c.elev_id

Page 24: Notiuni avansate MySQL - Infoeducatie 2009

RIGHT Join

• Opusul lui LEFT JOIN• Selectează toate comentariile în coloana din

dreapta şi pe coloana din stângă username-ul daca relaţia este satisfăcută.

• Daca nu se afişează NULL

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 23

SELECT e.username,c.comentariu FROMelevi e LEFT JOIN comentarii c ON e.id=c.elev_id

Page 25: Notiuni avansate MySQL - Infoeducatie 2009

DESCRIBE• Arată planul de execuţie ales de optimizator• Arată pentru fiecare tabel din sql : indecşi

folosiţi, tipul căutării, numărul de rânduri prin care caută, etc

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 24

• CâmpuriSelect_type – tip qureryTable – nume tabelPossible_keys – key-uri luate în considerareKey – cheia aleasă Key_len – lungimeaRows – nr. aprox. de rânduri prin care cautăExtra – file sort, tmp table, etc

• DESCRIBE [sql]

Page 26: Notiuni avansate MySQL - Infoeducatie 2009

Slow query logLocaţie my.ini

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 25

log_slow_queries = /var/log/mysql/my-slow.loglong_query_time = 2log-queries-not-using-indexes

Page 27: Notiuni avansate MySQL - Infoeducatie 2009

Query cacheLocaţie my.ini

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 26

query_cache_limit = 64Mquery_cache_size = 64M

Nu trebuie setată prea mare

Raportul read/write – invalidarea cache-ului

Trebuie urmărit cache hits

Page 28: Notiuni avansate MySQL - Infoeducatie 2009

Performanţă• Datele reţinute pe tipul cel mai mic md5 hash – binary(16) pack() ip – int 4 bytes ip2long()

• Indecşi mici – mai multă informaţie încape într-un bloc de memorie • Indecşi pe cheia de join• Binary log off

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 27

Don’t SELECT * FROM table ORDER BY RAND() LIMIT 1 SELECT COUNT(*) FROM table SELECT DISTINCT column FROM table

Page 29: Notiuni avansate MySQL - Infoeducatie 2009

ReferinţeRTFM

http://dev.mysql.com/doc/refman/5.0/en/http://dev.mysql.com/doc/refman/5.1/en/http://dev.mysql.com/tech-resources/articles/

Sculehttp://dev.mysql.com/workbench/http://dev.mysql.com/downloads/gui-tools/5.0.htmlhttp://munin.projects.linpro.no/

Lecturăhttp://www.mysqlperformanceblog.com/

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 28

Page 30: Notiuni avansate MySQL - Infoeducatie 2009

Intrebări?

Noţiuni avansate MySQL

Mihai Oaida <[email protected]> 29