12
MySQL panaudojimas didelės apimties sistemose Petras Bieliauskas ([email protected])

Petras Bieliauskas

Embed Size (px)

Citation preview

Page 1: Petras Bieliauskas

MySQL panaudojimas didelės apimties sistemose

Petras Bieliauskas ([email protected])

Page 2: Petras Bieliauskas

Eskimi mobilus socialinis tinklas 1 mln. narių 10mln. “pageviews” per dieną. 300 mln. per

mėnesį

18 000 narių online

95 mln. pageview per mėnesį

12000

60 000

Page 3: Petras Bieliauskas

Eskimi architektūra

php Memcached 2 www serveriai Duomenų bazė:

MySQL ~50GB; ~300 mln. įrašų; M-S replikavimas 2000 užklausų per sekundę;

Page 4: Petras Bieliauskas

Sistemos optimizavimo terminai

Vykdymo charakteristika (angl. Performance) vykdymo trukmė (angl. response time) pralaidumas (angl. throughput)

Išplečiamumas (angl. Scalability) Į aukštį (angl. scaling up) Į plotį (angl. scaling out)

Efektyvumas (angl. Efficiency)

Page 5: Petras Bieliauskas

Architektūrinės klaidos

“hardcodinti” duomenų bazių pavadinimai; Nėra galimybės(sudėtinga) nukreipti SELECT

užklausas į kitą serverį; Nėra galimybės perimti užklausas ir modifikuoti

prieš vykdant; mysql_connect skripto pradžioje; Per anksti priimti techniniai sprendimai;

Page 6: Petras Bieliauskas

Mes sparčiai augame!

Kešavimas; Duomenų bazės optimizavimas; Aplikacijos optimizavimas, kad efektyviau

panaudotų duombazę; Techninės įrangos atnaujinimas/didinimas; Duomenų bazės replikavimas; Funkcinis particionavimas; Sharding

Page 7: Petras Bieliauskas

Lentelės schema

Atominės reikšmės; Jokių “stebuklingų” lauko reikšmių; Kartais naudinga turėti perteklinę informaciją; Per daug indeksų lėtina įrašymą; Atlikti ALTER operaciją didelėje lentelėje yra

sudėtinga “hot column”

Page 8: Petras Bieliauskas

Teisingas duomenų tipo pasirinkimas

Mažesnis = geresnis; Paprastesnis = geresnis; Ar man tikrai reikia utf8-general-ci? Vengti NULL; varchar(100) vistiek geriau nei varchar(255);

Page 9: Petras Bieliauskas

Užklausų optimizavimas

Rezultatų limitavimas

Ar man reikia visų laukų (SELECT * ); SELECT * FROM users WHERE nick='petras'

EXPLAIN naudoti tik su realiais duomenimis; Vengti “subselect”;

SELECT * FROM users WHERE city_id IN (SELECT id FROM cities WHERE country=‘lt’)

Naudoti jungtinius indeksus

Page 10: Petras Bieliauskas

Puslapiavimo problema Priklauso nuo paieškos gylio:

Sugeneruoti pirmą puslapį nesunku; 100-asis puslapis – kita istorija

Alternatyvos: WHERE id BETWEEN 100 AND 110; WHERE id > 99 ORDER BY id ASC LIMIT 10; Puslapiuoti skripte

SELECT * FROM users WHERE country='lt' LIMIT 0, 10

SELECT * FROM users WHERE country='lt' LIMIT 100, 10

Page 11: Petras Bieliauskas

Mitai apie MySQL

Slave'ui nereikia gerų parametrų; Man nereikia backup, nes turiu slave; MyISAM vykdo skaitymą greičiau nei InnoDB; Replikavimas yra stabilu; Reikia sudėti indeksus ant visų stulpelių; LIMIT yra labai greitas ant MySQL; INT(1) užima mažiau vietos nei INT(11);

Page 12: Petras Bieliauskas

Ačiū už dėmesį!

[email protected]

www.iTo.lt