Notiuni avansate MySQL - Infoeducatie 2009
-
Upload
mihai-oaida -
Category
Technology
-
view
1.462 -
download
1
description
Transcript of Notiuni avansate MySQL - Infoeducatie 2009
Noţiuni avansate MySQL
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ţă
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
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 =
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
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
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
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');
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,..)
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)
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
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;
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
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
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
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');
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.
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
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;
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
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
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
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
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]
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
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
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
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