Upload
vanthien
View
221
Download
2
Embed Size (px)
Citation preview
RĪGAS TEHNISKĀ UNIVERSITĀTEDatorzinātnes un informācijas tehnoloģijas fakultāte
Lietišķo datorsistēmu institūts
MySQL
Izstrādāja: Rita BurboJānis Raubiško
2012.gada
Saturs
1. MySQL......................................................................................................................3
2. Vaicājumi...................................................................................................................4
1.1. Apvienošanas vaicājumi.....................................................................................5
1.2. Apvienošanas un statistikas vaicājumi...............................................................9
1.3. Pivot tabulu vaicājumi......................................................................................10
1.4. Datu salīdzināšanas vaicājumi..........................................................................11
1.5. Datumu un laiku vaicājums..............................................................................12
1.6. Frekvences vaicājumi.......................................................................................13
1.7. Sfērisko ģeometriju vaicājumi.........................................................................13
3. MySQL Optimizācija..............................................................................................15
3.1. Vienkārši veidi kā optimizēt vaicājumus.........................................................17
4. Secinājumi...............................................................................................................20
Literatūras saraksts........................................................................................................................21
1. MySQL
MySQL ir relāciju datubāzu vadības sistēma (DBVS). MySQL izstrādā Zviedrijas
uzņēmums MySQL AB, kuru 2008. gadā pārņēmaSunMicrosystems.MySQL ir risinājums
mazām un vidējām lietojumprogrammām. Tas ir iekļauts WAMP, AppServ, LAMP serveros un
pārnēsājamos serveros - Denver, XAMPP. Parasti MySQL tiek izmantots kā serveris, pie kura
vēršas vietējie (lokālie) vai attālinātie klienti, tas sevī ietver iekšējā servera bibliotēku, kas ļauj
MySQL iekļaut autonomās programmās.
1.att. MySQL emblēma
Elastība, ko nodrošina MySQL datubāze, tiek panākta ar daudzu tabulu veidu atbalstu:
lietotāji var izvēlēties MyISAM tipa tabulas, kas atbalsta pilnu teksta meklēšanu, vai InnoDB
tipa tabulas, kas atbalsta transakcijas atsevišķu ierakstu līmenī. Turklāt, MySQL datu bāzē ir
integrētas īpaša veida EXAMPLE tabulas, kas ilustrē jaunu tabulu izveidošanas principus.
Pateicoties tās atvērtajai arhitektūrai un GPL licencēm, MySQL regulāri parādās jauna veida
tabulas.
MySQL ir šāds programmēšanas valodu atbalsts: Delphi, C, C + +, Eiffel, Java, Lisp,
Perl, PHP, PureBasic, Python, Ruby, Smalltalk, ComponentPascal, un Tcl bibliotēkas
priekš .NET platformu valodā, kā arī ODBC atbalsts, izmantojot MyODBC dziņus.
2. Vaicājumi
Vaicājums ir lietotāja vēršanās pie datu bāzes, lai iegūtu nepieciešamo informāciju.
Visbiežākā operācija SQL ir vaicājums, ko veic ar deklaratīvo paziņojumu SELECT. SELECT
atgriež datus no vienas vai vairākām tabulām vai vienādībām. Standarta SELECT
pieprasījumiem nav ilgstošu seku uz datubāzi, bet tās var būt izmantojot nestandarta SELECT
paveidus, piemēram, SELECT INTO.
Vaicājumi atļauj lietotājam aprakstīt vēlamos datus, atstājot datu bāzu vadības sistēmu
(database management system (DBMS)) atbildīgu par plānošanu, optimizēšanu, un fizisko
darbību veikšanu, kas ir nepieciešams, lai saņemtu rezultātu.
Vaicājums ietver sarakstu ar kolonnām, kas būs ietvertas rezultātā tūlīt pēc SELECT
atslēgvārda. "Zvaigznīte" ("*"), var tikt lietota lai norādītu, ka vaicājumam jāatgriež visas
kolonnas vaicātajās tabulās. SELECT ir vissarežģītākais priekšraksts SQL valodā, ar izvēles
atslēgvārdiem un nosacījumiem, kas ietver:
Nosacījums FROM - norāda tabulu/tabulas no kuras dati jāiegūst. Nosacījums
FROM var iekļaut izvēles apakš nosacījumu JOIN, lai precizētu noteikumus
tabulu savienošanai.
Nosacījums WHERE - ietver salīdzinājuma predikātu, kas ierobežo atgrieztās
rindas no vaicājuma. Nosacījums WHERE likvidē visas rindas no rezultātu
kopas, kuras salīdzinājuma predikāts nenovērtē, kā "Patiesas" ("True").
Nosacījums GROUP BY - tiek bieži lietots kopā ar SQL apkopšanas funkcijām,
vai arī lai atbrīvotos no dublētām rindām rezultātu kopā. Nosacījums WHERE
tiek piemērots pirms nosacījuma GROUP BY.
Nosacījums HAVING - ietver predikātu, kas tiek lietots lai filtrētu rindas, kas
izriet no nosacījuma GROUP BY. Tāpēc, ka tas darbojas uz nosacījuma GROUP
BY rezultātiem, apkopšanas funkcijas var tikt lietotas izmantojot nosacījuma
HAVING predikātu.
Nosacījums ORDER BY - identificē kuras kolonnas tiek lietotas lai sakārtotu
iegūtos datus, un kurā virzienā tie būtu jākārto (augošā vai dilstošā secībā). Bez
ORDER BY nosacījuma, rindu secība kuru atgriež SQL vaicājums ir nenoteikts.
SQL vaicājumus var iedalīt 4 daļās:
Datu manipulēšanas vaicājumi (SELECT, INSERT, UPDATE, DELETE,
MERGE)
Datu definēšanas vaicājumi (CREATE, DROP, TRUNCATE, ALTER)
Datu kontroles vaicājumi (GRANT, REVOKE)
Transakciju kontroles vaicājumi (BEGIN WORK vai START TRANSACTION,
COMMIT, ROLLBACK).
1.1. Select iespējasSELECT [ALL | DISTINCT | DISTINCTROW] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr ...] [FROM table_references [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] [PROCEDURE procedure_name(argument_list)] [INTO OUTFILE 'file_name' export_options | INTO DUMPFILE 'file_name' | INTO var_name [, var_name]] [FOR UPDATE | LOCK IN SHARE MODE]]
MySql atbalsta visas standarta Select vaicājuma iespējas. Kā papildiespējas tiek
piedāvātas SQL_BUFFER_RESULT, SQL_CALC_FOUND_ROWS (neiesaka izmantot
veiktspējas pasliktināšanās dēļ)
1.1.Apvienošanas vaicājumi
Visbiežāk pielieto tieši šāda veida vaicājums, lai veiktu datu grupēšanu. Pārsvara ar
šādiem vaicājumiem parāda mazāko, lielāko, summu, vidējo vai kādu citu statistisko vērtību, kas
atrodas kolonnās.
Vaicājums izskatās aptuveni šādi:
SELECT class, MIN(bar) AS bar
FROM tabula
GROUP BY class
Zemāk redzamajā piemēra ir redzams, ka pielietot vaicājumos group_concat, lai varētu
sagrupēt datus ņemot vēra to id.
2.att. Vienkāršs sagrupēšanas vaicājums
Izmantojot šādu vaicājumu var izgūt ne tikai vienas tabulas kopsavilkumu. Var apvienot
vairākas tabulās un izgūt kopīgus datus grupējot kolonas.
3.att. Vaicājums ar vairākām tabulām
Apvienošanas vaicājumi ir iespējams sadalīt daudzos apakš tipos, lai vieglāk varētu
orientēties un atrast vispiemērotāko vaicājumu datu atlasīšanai.
Apakš tipu nosaukumi ir atkarīgi no tā, kāda veida tiek izgūti dati. Piemēra, kas tika
aplūkots 4.att. dati ir izgūti izmantojot apvienošanas vaicājumi, kas iet pāri kolonām.
4.att. Apvienojošais vaicājums: diagonāli kolonamVar izgūt datus arī no vairākām tabulām apvienojot tos un pēc tām izmantojot
iepriekšējo veidu izgūt vajadzīgo informāciju. Zemāk redzamajā piemēra ir 1 galvenā un 2 apakš
tabulas. Vaicājums ļauj galvenajai tabulai apvienot datus no apakš tabulām.
5.att. Vaicājums, lai izgūtu datus no vairākām tabulām
Izmantojot apvienošanas vaicājumu ir iespējams izgūt datus no ļoti sarežģītām tabulām.
Mūsdienas bieži vien var sastapt tabulās, kuras izgūst datus no citas tabulas un tā var izgūt no
citas tabulas datus, tā veidojot tabulu virteni. Lai izgūtu no tādam tabulām datus izmanto
ūdenskrituma (kaskādes) apvienošanas vaicājumu.
6.att. Kaskādes vaicājuma pielietošana
Lai izgūtu datus no tabulām var izmantot arī group_concat un count funkcijās, lai varētu
iegūt unikālu ierakstu skaitu.
7.att. Group_concat pielietošana
1.2.Apvienošanas un statistikas vaicājumi
Šajā sadaļa tika apskatīta tikai korelācijas vaicājums. Korelācija ir statiskais radītājs
vērtībām, kuras nav nejaušas un šīs vērtības ir lineāri saistītas starp pāriem, kas atrodas datu
kopās. Tas tiek apzīmēts ar r, un tās svārstās no -1 līdz +1, kur -1 liecina par perfektu apgriezto
korelāciju (regresijas līnija iet uz leju no kreisās uz labo), 0 norāda to ka korelācijas nav (nav
regresijas līnijas), un1norādaperfektutiešukorelāciju (regresijas līnija iet uz augšu kreisās
uzlabo).
Izstrādājot tabulu tiek uzskatīts kā x ir augstums un y ir mērījumu vērtība un tiek
meklēta korelācija starp to vērtībām. Eksistē vairākas korelācijas formulas, bet viena no
populārākajām ir Pearsona, kurā tiek pielietota šajā gadījumā.
8.att. Korelācijas vaicājums
1.3.Pivot tabulu vaicājumi
Pēc idejas vaicājums izskatās šādi:
SELECT class, GROUP_CONCAT(member)
FROM tabulas
GROUP BY class;
Šīs vienkāršais vaicājums jau daļēji atgādina hibrīdu, kas daļēji ir līdzīgs gan CUBE,
gan EAV (entity attribute value).
9.att. Pivot tabulas vaicājums
1.4.Datu salīdzināšanas vaicājumi
Šis vaicājums izmanto Unions, lai saskaņotu kolonnu nosaukumus no divām tabulām,
un tur rindas ar nesaskaņotiem datiem. Pielāgojot kolonu sarakstu{id, col1, col2, col3...} kā
vēlamo, bet parasti lietotājs vēlas, lai sāktu ar primāro atslēgu:
10.att. Salīdzināšanas vaicājuma shēma
Zemāk ir redzams, ka izmantot šādu vaicājumu salīdzinot 2 tabulu datus (11.att.).
11.att. Datu salīdzināšanas vaicājuma piemērs
1.5.Datumu un laiku vaicājums
Šie vaicājumu izvada datumus un laikus. Tie var būt dati kas saistīti ar datubāzēm,
tabulām, datoru, vai veikt atskaiti, utt.
12.att Datumu vaicājums datoram
13.att. Dienu skaitīšanai
1.6.Frekvences vaicājumi
Visbiežāk vaicājums shēmas ir šādas:
SELECT id
FROM tabula
GROUP BY id
HAVING COUNT(*) = N;
vai
SELECT a.*
FROM tbl a
JOIN tbl b ON a.id = b.id AND MOD(b.id, N ) = 0;
1.7. Sfērisko ģeometriju vaicājumi
Atrast attālumu starp diviem punktiem uz Zemes virsmas ir viena no problēmām, kuru
iespējams risināt izmantojot MySQL funkcijas. Lai atrisinātu šo uzdevumu ir jāzina pirmās
kārtas tuvināšana, jāignorē novirzes no Zemes virsmas. Tad attālums radiānos apstrādāts ar
vairākām trigonometriskām formulām.
3. MySQLOptimizācija
Optimizēšana ir nepieciešama, lai varētu veikt vairāk darbu izmantojot mazāk resursu.
Tās ir aktuāli, kad datu daudzums pieaug un veiktspēja samazinās.
Vienkāršas lietas, kas jāzina, lai nezaudētu MySQL veiktspēju:
Datubāzes dizaina pareiza izstrāde:
o Pareizu kolonu parametru izvēle:
Atbilstošs izmērs (lai pietiktu un nebūtu neadekvāta rezerves);
Piemērotu kolonu tipa izvēle;
Notnull pielietošana;
Pielietot noteiktu kolonas izmēru (MyISAM tabulas ar noteiktu
rindu izmēru ir ātrākas; laiksakritību uzlabošana);
Krātuvju datu saspiešana, kur tās ir iespējams;
o Pareizu tabulas tipa izvēle:
Pareiza modeļa izvēle (tabulām (MyISAM), rindām (InnoDB),
lapām (BDB));
Transakciju nepieciešamība;
Ārējo atslēgu ierobežošana;
Vai ierakstu zaudēšana ir iespējama problēmu gadījumā;
Pareizo MySQL tabulu tipa izvēle;
o MyISAM tabulā
Kompakta krātuve;
Nav transakciju;
Tabulas noslēgtas;
Variācijas: Saspiestā, RAID, Saplūdināšanas;
o Saspiesta MyISAM tabulā:
Tikai lasīšanai;
Piemērots priekš CD-ROM un arhīviem;
o MyISAM RAID tabulā:
Pārtraukums 2 GB/4GB/jebkur pie šķēršļa;
o MyISAM sapludināta tabulā:
Daudz fizisku identisku MyISAM tabulu;
Var apstrādāt kā 1 tabulu;
Pareiza pielietošana:
o Nesaglābāt nevajadzīgus datus:
Saspiest tos;
Izdzēst tos;
o Nesaglabāt datus no var aprēķināt;
o Nepieprasīt izvadīt tos datus, kas nav nepieciešami (Select* From…);
o Pielietot MySQL attīstības iespējas priekš ātruma:
REPLACE vaicājumi;
Multi-table dzēšana;
o Neizmantot nevajadzīgus vaicājumus:
o Pielietot transakcijas:
Novērš datu zaudēšanu;
Serveris samazina nejaušos I/O;
Veiktspēja un drošums palielinās;
o Īsas primāras atslēgas priekš InnoDB;
o Web apps
Pielietot starpprogrammatūru, lai abstrahēt datubāzi
Neglabāt visu datubāze (piemēram, attēlus var izvietot failu
sistēma);
o Ātru vaicājumu pielietošana:
Pielietot indeksus;
Pielietot ExplainSelect;
Vienkārši;
UNIONs;
Komplekti Insert;
Izprast kā vaicājums darbojas, lai izvairītos no nevajadzīgam
darbībām;
o ExplainSelect:
Pasaka ko MySQL domā;
Pasaka kuru atslēgu (indeksu) var izmantot;
Pasaka kuru atslēgu izmantos;
Pasaka cik rindu tiks pārbaudītas (aptuveni);
14.att. ExplainSelect Jauninājumu pielietošana
o It īpaši jāpārbauda jauninājumi vaicājumiem, kuri ir sarežģīti un nedroši;
3.1.Vienkārši veidi kā optimizēt vaicājumus
Visbiežāk izceļ 3 veidus kā var optimizēt vaicājumus.
1. Pielietojot indeksus.
MySQL ļauj indeksēt datubāzes tabulās, kas ļauj ātri meklēt ierakstus neveicot pilnu
tabulas skenēšanu un tādējādi ievērojami paātrinot vaicājumu izpildi. Iespējams izveidot līdz 16
indeksiem uz tabulu, un MySQL atbalsta arī vairāku kolonnu indeksus un pilna teksta
meklēšanas indeksu.
CREATE INDEX idx_username ON users(username);
SHOW INDEX FROM users;
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality |
Sub_part | Packed | Null | Index_type | Comment |
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| users | 1 | idx_username | 1 | username | A | NULL | NULL | NULL |
YES | BTREE | |
--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
1 rowinset (0.00 sec)
Jāņem vēra, ka indeksu pielietošana ne vienmēr padara darbu vieglāku. Indeksēt katru
tabulas lauku parasti nav vajadzības, jo tas palēnina MySQL vienmēr, kad tiek ievietoti vai
atjaunoti dati, jo MySQL veic papildus darbu, lai atjaunotu indeksus katru reizi. Tādējādi
vienmēr jāmeklē kompromisus, lai izstrādājot indeksēšanas sistēmu, tā palīdzētu lietotājam veikt
darbu.
2. Optimizēt vaicājumu veiktspēju;
Analizējot vaicājuma veiktspēju ir lietderīgi izmantot EXPLAIN atslēgvārdu. Šis
atslēgvārds, novietots pirms Select vaicājumam, apraksta, kā MySQL plāno izpildīt vaicājumu
un rindu skaitu, ko būs nepieciešams apstrādāt, lai sekmīgi sasniegtu rezultātu kopu.
EXPLAIN SELECT city.name, city.district FROM city, country WHERE city.countrycode
= country.code AND country.code = 'IND';
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | country | const | PRIMARY | PRIMARY | 3 | const | 1 | Usingindex |
| 1 | SIMPLE | city | ALL | NULL | NULL | NULL | NULL | 4079 | Usingwhere |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------------+
2 rowsinset (0.00 sec)
3. Pielāgot iekšējos mainīgos;
MySQL ir tik atvērta, ka to noklusētos iestatījumus ir diezgan viegli mainīt, lai iegūtu
sev piemērotāku MySQL. Daži no galvenajiem mainīgajiem, kuru vajadzētu optimizēt, ir
uzskaitīti zemāk.
AlteringIndexBufferSize (key_buffer);
Šis mainīgais kontrolē bufera lielumu, ko izmanto tabulu indeksi (lasīšanas un
rakstīšanas operācijām). MySQL rokasgrāmata iesaka šo mainīgo palielināt "tik cik jūs varat
atļauties", lai nodrošinātu vislabāko veiktspēju indeksētām tabulām, un ieteicama vērtība ir
līdzvērtīga aptuveni 25 procentiem no kopējā sistēmas atmiņas apjoma. Šis ir viens no
svarīgākajiem MySQL konfigurācijas mainīgajiem.
AlteringTableBufferSize (read_buffer_size);
Kad vaicājums pieprasa, lai tabula tiktu skenēta secīgi, MySQL piešķir atmiņas buferi
šim vaicājumam. Read_buffer_size mainīgais kontrolē šī bufera lielumu. Ja jūs konstatējat, ka
secīga skenēšana norit lēni, jūs varat uzlabot veiktspēju, palielinot šo vērtību, un līdz ar to arī
bufera atmiņas izmēru.
SettingTheNumberOfMaximumOpenTables (table_cache)
Šis mainīgais kontrolē maksimālo tabulu skaitu MySQL, kas varbūt atvērtas jebkurā
laikā. Tādējādi kontrolē servera spēju reaģēt uz ienākošajiem pieprasījumiem. Šis mainīgais ir
cieši saistīts ar max_connections mainīgajiem. Šīs vērtības palielināšana ļauj MySQL uzturēt
lielāku atvērto tabulu skaitu, palielino tmax_connections palielinās atļauto pieslēgumu skaits.
Deciding A TimeLimitForLongQueries (long_query_time)
MySQL ir tā saukto "slow query log", kas automātiski reģistrē visus vaicājumus, kuri
netika izpildīti noteiktā termiņā. Žurnāls ir noderīgs, lai izsekotu vaicājumus, kuri ir neefektīvi.
Dažas MySQL oprimizēšanas triki:
Pielietojot SQL_CALC_ROWS un FOUND_ROWS() (nevajadzēs izmantot
dubult vaicājumus):
Select … Limit n, m
Select count(*)
Šo vaicājumu vietā var izmantot:
Select … Limit n, m
Select FOUND_ROWS()
Pielietot UNION lai pārrakstītu lēnus OR vaicājumus:
Select *
From myTable
Where col1 = ‘foo’ OR col2 = ‘bar’
Tā vietā pārrakstīt:
(Select *
From myTable
Where col1 = `foo`)
UNION
( Select *
From myTable
Where col2 = ‘bar’)
Sistematizēšana, ierobežošana, un atkārtota sistematizēšana:
(Select *
FrommyTable
Where col1 = `foo`
Orderby col2 Limit 50)
Orderby col3
4.
4. Secinājumi
Mūsdienās MySQL ir viena no populārākajām relāciju datubāzu vadības sistēmām, ko
izmanto visā pasaulē. Ar tās palīdzību ir iespējams izstrādāt datu krātuvēs, kuras atvieglo darbu
ikdienas.
Vaicājumi ļauj izgūt nepieciešamos datus no datu krātuvēm. Visbiežāk pielieto
vaicājumus, kas iegūst datus no tabulām. Vaicājums var atlasīt mums nepieciešamos datus un tos
sakārtot izmantojot group by un order.
Taču vaicājumi ne tikai spēj atlasīt datus, ko mēs esam ievadījuši tabulās, bet arī veikt
aritmētiskus un ģeometriskus aprēķinus ar šiem datiem. Ka arī vaicājumus var pielietot lai
salīdzinātu datus dažādās kolonās. Vaicājumi ļauj mums iegūt ļoti daudzveidīgu informāciju,
taču daudzi cilvēki vienkārši nezin vai nespēj pilnvērtīgi izmantot šīs iespējas. MySQL
programma, protams, spēj mazliet palīdzēt lietotājam ar explain select, kas palīdz izsekot, ko
konkrētais vaicājums dara un piedāvāt alternatīvas.
Vēl viena svarīga lieta, kas jāzina darbojoties ar datubāzēm un vaicājumiem ir
optimizēšana, kas ļauj mums iegūt ātrāk datus tajā paša laikā nenodarot kaitējumu datiem un
datoriem. Bieži vien pietiek ar to kā tiek korekti sastādītas datubāzēs un tabulās ar
vispiemērotākajiem parametriem, lai nodrošinātu labu MySQL veiktspēju.
Literatūras saraksts
1. http://www.w3resource.com/MySQL/MySQL-tutorials.php
2. http://www.artfulsoftware.com/infotree/queries.php#1031
3. http://www.slideshare.net/renato_shira/MySQL-optimization
4. http://www.petefreitag.com/item/613.cfm
5. http://stackoverflow.com/questions/8599204/how-can-i-make-this-query-more-
efficient
6. http://dev.mysql.com/doc/refman/5.0/en/select.html