Upload
darius-leskauskas
View
1.095
Download
1
Embed Size (px)
Citation preview
MySQL panaudojimas didelės apimties sistemose
Petras Bieliauskas ([email protected])
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
Eskimi architektūra
php Memcached 2 www serveriai Duomenų bazė:
MySQL ~50GB; ~300 mln. įrašų; M-S replikavimas 2000 užklausų per sekundę;
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)
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;
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
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”
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);
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
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
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);