Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  MySQL päringu optimeerimine märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 11.11.2011 01:19:56 MySQL päringu optimeerimine vasta tsitaadiga

Tervist, vajan abi sql päringu optimeerimisel (või siis uue lahenduse leidmisel). Tegu on menüü tabeliga, kust peaks teatud read igal korral lehele väljastama.

Mida üritan saavutada: Tabelist "mainmenu" valitakse pealkirja tüüp (title_type - Väärtused: 0-Samast tabelist, pole php konstant, 1-Mooduli tabelist ID järgi, 2-Samast tabelist, on php-s konstant),
custom_a (link, kui tegu pole mooduliga), custom_click (onclick action lingil), objekti nimi(kui tüüp = 1), module_name (kui tüüp = 1), link_title (igal tüüp = x korral)

sql:
  1. SELECT `title_type`, `custom_a`, `custom_click`, IF(title_type = '1', (SELECT objects.object_name FROM `objects` WHERE mainmenu.object_id = objects.object_id), '0') AS object_name, IF(title_type = '1', (SELECT `short` FROM `modules` WHERE mainmenu.module_id = modules.id), '0') AS module_name,
  2. IF(title_type = '1', (SELECT `long` FROM `modules` WHERE mainmenu.module_id = modules.id), (SELECT `title`)) AS link_title FROM `mainmenu` WHERE enabled = '1' ORDER BY `position` 

Kood ise on toimiv, aga ilmselgelt pole see optimaalne lähenemine. Kas mingil viisil on võimalik subquery'd panna ühe IF'i alla? Kas peaks mainmenu tabeli üleüldse ringi tegema?
Tabelid:
Spoiler Spoiler Spoiler
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 11.11.2011 10:27:21 vasta tsitaadiga

Ilusam ja elegantsem ja paremini loetav lahendus oleks äkki sellest päringust teha view? Ehk siis - sul on kaks päringut põhimõtteliselt - title_type = 1 ja title_type != 1. View jaoks võiks kummagi juhu eraldi ühe päringuna välja kirjutada - siis saab kenasti JOIN konstruktsioone kasutada ja asi näeb oluliselt viisakam välja ning siis mõlemad päringud view definitsiooni panna ja UNION võtmesõnaga kokku liita. Rakendusse saab siis panna aga juba mingi täiesti primitiivse päringu, mis selle view pihta käib.

Koodikeeles võiks see välja näha midagi taolist:
sql:
  1. CREATE OR REPLACE VIEW menu_data AS
  2.   SELECT ...
  3.   -- lisa vajalikud väljad, tabelite join'id jne
  4.   WHERE title_type = 1
  5.   UNION
  6.   SELECT ...
  7.   -- lisa vajalikud väljad, tabelite join'id teise variandi jaoks
  8.   WHERE title_type != 1

Rakendusse jääb siis aga lihtsalt
sql:
  1. SELECT * FROM menu_data WHERE ...

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
nemu
HV vaatleja
nemu

liitunud: 22.01.2002



Autoriseeritud ID-kaardiga

sõnum 11.11.2011 10:28:02 Re: MySQL päringu optimeerimine vasta tsitaadiga

Kõigepealt vähe loetavamale kujule
sql:
  1.  
  2. SELECT
  3.   mm.title_type,
  4.   mm.custom_a,
  5.   mm.custom_click,
  6.   o.object_name AS object_name,
  7.   m.short AS module_name,
  8.   m.long AS module_longname
  9. FROM mainmenu mm
  10. LEFT JOIN objects o ON (mm.object_id = o.object_id AND mm.title_type = 1)
  11. LEFT JOIN modules m ON (mm.module_id = m.id AND mm.title_type = 1)
  12. WHERE mm.enabled = 1
  13. ORDER BY mm.position;
  14.  
Kommentaarid: 12 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 11
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 11.11.2011 12:28:28 Re: MySQL päringu optimeerimine vasta tsitaadiga

nemu kirjutas:
Kõigepealt vähe loetavamale kujule
sql:
  1.  
  2. SELECT
  3.   mm.title_type,
  4.   mm.custom_a,
  5.   mm.custom_click,
  6.   o.object_name AS object_name,
  7.   m.short AS module_name,
  8.   m.long AS module_longname
  9. FROM mainmenu mm
  10. LEFT JOIN objects o ON (mm.object_id = o.object_id AND mm.title_type = 1)
  11. LEFT JOIN modules m ON (mm.module_id = m.id AND mm.title_type = 1)
  12. WHERE mm.enabled = 1
  13. ORDER BY mm.position;
  14.  
Hetkel jätab Sinu lahendus arvestamata asjaolu, et kui title_type != 1, siis oli vaja teised andmed pärida. Jah, need võiks hetkel lihtlabaselt lisada päritavate veergude hulka, aga sel juhul tuleb hakata rakenduses päringu tulemustest erinevaid veerge lugema vastavalt title_type väärtusele, mis tekitab täiendava keerukuse, mida poleks ilmselt vaja.

Aga eks teemapüstitaja ise otsustab, mis talle meeldib.. icon_smile.gif

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
nemu
HV vaatleja
nemu

liitunud: 22.01.2002



Autoriseeritud ID-kaardiga

sõnum 11.11.2011 12:45:29 vasta tsitaadiga

Arvestamata asjaolud on ilmselt kuskil ridade vahel nii et ma ei suuda neid näha.
Lähtusin rohkem lausest "Kood ise on toimiv...".
Kui "menu" pole ajas eriti muutuv, siis võiks hoopis mälus hoida ja aegajalt baasist värskendada.
Kommentaarid: 12 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 11
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 11.11.2011 12:50:48 vasta tsitaadiga

Fukiku, tänud kõigepealt thumbs_up.gif , proovin seda lahendust ning annan teada kuidas õnnestus.
nemu kirjutas:
Kui "menu" pole ajas eriti muutuv, siis võiks hoopis mälus hoida ja aegajalt baasist värskendada.

Menu on ajas muutuv niipalju, et kui kasutaja pole sisse logitud, näidatakse üht, kui kasutaja on sisse logitud, on menüü jällegi veidi teistsugune.
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 11.11.2011 12:57:19 vasta tsitaadiga

nemu kirjutas:
Arvestamata asjaolud on ilmselt kuskil ridade vahel nii et ma ei suuda neid näha.
Lähtusin rohkem lausest "Kood ise on toimiv...".
Kui "menu" pole ajas eriti muutuv, siis võiks hoopis mälus hoida ja aegajalt baasist värskendada.
Viitasin sellele, et esialgses päringus oli IF lausetel olemas ka ELSE osa, mille sinu päring arvestamata jättis.
_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
nemu
HV vaatleja
nemu

liitunud: 22.01.2002



Autoriseeritud ID-kaardiga

sõnum 11.11.2011 13:07:17 Re: MySQL päringu optimeerimine vasta tsitaadiga

Viimane on tõesti kaduma läinud.
sql:
  1.  
  2. SELECT
  3.   mm.title_type,
  4.   IF (mm.title_type = 1, NULL, mm.custom_a) AS custom_a,
  5.   mm.custom_click,
  6.   o.object_name AS object_name,
  7.   m.short AS module_name,
  8.   IF (mm.title_type = 1, m.long, mm.title) AS link_title
  9. FROM mainmenu mm
  10. LEFT JOIN objects o ON (mm.object_id = o.object_id AND mm.title_type = 1)
  11. LEFT JOIN modules m ON (mm.module_id = m.id AND mm.title_type = 1)
  12. WHERE mm.enabled = 1
  13. ORDER BY mm.position;
  14.  
Kommentaarid: 12 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 11
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 11.11.2011 13:23:53 vasta tsitaadiga

nemu, see lahendus täitsa toimib thumbs_up.gif
Pole veel jõudnud VIEW varianti proovida, kuid kumb peaks loogiliselt võttes kiirem olema?
Niipalju kui jõudsin selle kohta lugeda, sain teada, et teatud query'de puhul võib ta kiirust hoopis alandada.
Explain annab järgmise tulemuse:
id   select_type   table   type   possible_keys   key   key_len   ref   rows   Extra
1   SIMPLE   mm   ref   enabled_INDEX   enabled_INDEX   4   const   2   Using where; Using filesort
1   SIMPLE   o   eq_ref   PRIMARY   PRIMARY   4   data.mm.object_id   1   
1   SIMPLE   m   eq_ref   PRIMARY   PRIMARY   4   data.mm.module_id   1   

Kõigi puhul võib ilmselt rahule jääda.
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Le Inc
HV Guru
Le Inc

liitunud: 06.09.2002



Autoriseeritud ID-kaardiga

sõnum 24.11.2011 20:19:29 vasta tsitaadiga

Kiiruse saad teada kui päringu sooritad. Üks viis "optimeerimiseks" on kasutada SSD kettaid. icon_lol.gif

Näiteks sama päring SSD vs. vanakooli SCSI vint on ~10x kiiruse vahe mäluketta kasuks.
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 54
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 24.11.2011 23:03:52 vasta tsitaadiga

Le Inc kirjutas:
Kiiruse saad teada kui päringu sooritad. Üks viis "optimeerimiseks" on kasutada SSD kettaid. icon_lol.gif

Näiteks sama päring SSD vs. vanakooli SCSI vint on ~10x kiiruse vahe mäluketta kasuks.

Seda kindlasti. icon_lol.gif
Kahjuks kogemusi hetkel SSD ketastega ei ole, kuid järgmisel kuul lähen üle Sandy Bridge'ile (i5 2500K) ja loodetavasti järgmisel aastal saan soetada oma esimese SSD. thumbs_up.gif icon_biggrin.gif
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
Redikate
HV veteran
Redikate

liitunud: 30.12.2005




sõnum 28.11.2011 13:03:08 vasta tsitaadiga

Le Inc kirjutas:
Kiiruse saad teada kui päringu sooritad. Üks viis "optimeerimiseks" on kasutada SSD kettaid. icon_lol.gif

Näiteks sama päring SSD vs. vanakooli SCSI vint on ~10x kiiruse vahe mäluketta kasuks.


Kodus võid ju oma baase SSD peal hoida, kuid paljud teenuspakkujad tänasel päeval SSD lahendust pakuvad?

_________________
http://nodejs.org/
"I'm also a person. Programming is just one thing I do."
Kommentaarid: 34 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 33
tagasi üles
vaata kasutaja infot saada privaatsõnum
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 01.12.2011 18:14:34 vasta tsitaadiga

Le Inc kirjutas:
Kiiruse saad teada kui päringu sooritad. Üks viis "optimeerimiseks" on kasutada SSD kettaid. icon_lol.gif

Näiteks sama päring SSD vs. vanakooli SCSI vint on ~10x kiiruse vahe mäluketta kasuks.

Siin on 2 viga:
1. Kiiruse teadasaamiseks pressid "Explain Plan" (või mis iganes selle nupu nimi kasutatavas vahendis on). See ei soorita päringut. Küll ja küll olen sedasi kinni püüdnud päringuid "oleks kiirelt LIVE-st vaja andmeid saada, pane ainult käima".
2. Tarkvaralisi probleeme ei lahendata riistvaraga. See "10x vahe" on optimistlik, samas päringut optimeerides võid võita mitme suurusjärgu rohkem ja seda igasuguse riistvara peal. Optimeerimine algab aga andmemudelist - kui selles faasis on üle jala lastud, siis hiljem on väga raske.
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 01.12.2011 23:16:58 vasta tsitaadiga

Reaalne päring + fetch ja selleks kujunev aeg selgub ikka peale käivitamist, explain plan annab mingisuguse aimduse sellest.

Väide on õige, et optimeerimine algab andmemudelist, aga reaalsuses on seda hiljem muuta sama võimatu kui saada lahti Savisaarest. Ehk lõpuks hakatake ikka sitast saia tegema kuna lihtsalt muud võimalust ei ole.
Ma muidugi ei ütleks, et riistvaraliselt tuunimine oleks väga vale. Me saime näiteks 10% baasi võimsuses juurde liikudes Linuxile, mis võimaldas kasutada teisi prosesi. Sama numbri saamiseks softi tuunides, oleks investeering pidanud olema ca 10x rohkem kui raha kulus riistvarale. Oracle mõistes upgrade näiteks 10g pealt 11g peale annab niivõrd palju võimalusi päringute tuunimiseks, et tõenäoliselt jällegi odavam kõik suured päringud üle käia ja ringi kirjutada kui riistvara juurde osta.
Case by case.
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
Le Inc
HV Guru
Le Inc

liitunud: 06.09.2002



Autoriseeritud ID-kaardiga

sõnum 18.12.2011 20:08:06 vasta tsitaadiga

2korda2 kirjutas:
Le Inc kirjutas:
Kiiruse saad teada kui päringu sooritad. Üks viis "optimeerimiseks" on kasutada SSD kettaid. icon_lol.gif

Näiteks sama päring SSD vs. vanakooli SCSI vint on ~10x kiiruse vahe mäluketta kasuks.

Siin on 2 viga:
1. Kiiruse teadasaamiseks pressid "Explain Plan" (või mis iganes selle nupu nimi kasutatavas vahendis on). See ei soorita päringut. Küll ja küll olen sedasi kinni püüdnud päringuid "oleks kiirelt LIVE-st vaja andmeid saada, pane ainult käima".
2. Tarkvaralisi probleeme ei lahendata riistvaraga. See "10x vahe" on optimistlik, samas päringut optimeerides võid võita mitme suurusjärgu rohkem ja seda igasuguse riistvara peal. Optimeerimine algab aga andmemudelist - kui selles faasis on üle jala lastud, siis hiljem on väga raske.


Mida teha kui pärid ~1 miljonilisest tabelist näiteks max(id) väärtust? Või küsid mingit osa tabelist? Tabelil on unikaalne id ja indeksid olemas. Ei oska rohkem optimeerida. Päring võtab ~13 .. 15 sek aega. SSD peal kuskil sekundi kandis. Mälu ja prose on ka uuel baasil kiiremad/suuremad. See pole ilmselt nii määrav kui vint, too on just põhiline mis pidurdab (ketas on tõesti vana, ilmselt tänapäevane "tavaline" desktopi 1 TB ketas oleks kiirem).

SSD on uus ja uurimata bisnis andmebaasides. Teatud olukordades on asi väga põhjendatud, iseasi kas ka kestvust on. Eks aeg näitab.
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 54
tagasi üles
vaata kasutaja infot saada privaatsõnum
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 18.12.2011 21:21:12 vasta tsitaadiga

Le Inc kirjutas:
Mida teha kui pärid ~1 miljonilisest tabelist näiteks max(id) väärtust? .....Päring võtab ~13 .. 15 sek aega.

Ma pean tunnistama, et olen MySQL-ga kokku puutunud ainult libamisi aga see lihtsalt ei saa tõsi olla tingimusel, et see ID on PK. Midagi peab süsteemis VÄGA mäda olema (mälu ei ole piisavalt?).
Miljoni kirjega tabelid baasis, mis jooksis tavalises desktopis - see oli tuttav probleem aastal 2001-2003, kui riistavara maksis palju ja korralikku serveri jaoks polnud paljudel raha. Ma kahtlen, et su riistvara veel kehvem on. Ometi ei võtnud ka tollal sellised päringud nii kaua aega. Mootoriks oli Sybase ASA (7 või 8).
Lisaks, milleks kasutad max(id)? Minul on seda vaja olnud vaid probleemsetes olukordades, kus keegi on osanud kuidagi sequence-i katki teha (andmete baasi laadimine sequence't kasutamata vms).
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
Le Inc
HV Guru
Le Inc

liitunud: 06.09.2002



Autoriseeritud ID-kaardiga

sõnum 18.12.2011 22:05:39 vasta tsitaadiga

See oli lihtsalt näide. Kui küsid näiteks mingit osa tabelist read 340 - 360 vms (kuvatakse mingi X arv lehti korraga), siis on sama päringu aeg. Kusjuures see kasvas koos tabeli suurenemisega proportsionaalselt. Jah "select count(*) from tabel" võtab tõesti murdosa sekundist aega iga ilmaga. icon_lol.gif

Tegu siis ikkagi tasulise Oracle 10g baasiga. Tõsi raud on vana ja jookseb XP peal. icon_smile.gif Nii või naa, SSD'ga on elu hoopis teises dimensioonis. Siin põmst ei peagi koodi optimeerima. Peaasi et kettad kestaks.
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 54
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 19.12.2011 11:11:08 vasta tsitaadiga

See et sul on primary key ja indeksid ja üle nende teed päringu, ei tähenda veel, et käivitusplaan korras oleks.
Alati on võimalus arvutada andmeid ette kas planeeritult või online'is või kasutada Compressionit(aitab kombinatsioonis aeglane ketas-kiire prose. 10g küll natuke piiratud, aga effekti annab), partitsioneerimist või hoopis midagi muud.
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 19.12.2011 18:51:19 vasta tsitaadiga

Oracle XP peal on nagu sadul sea seljas - saab aga pole kombeks. Kõige tõenäolisem probleem (kui baas on tõesti suur) - mälukasutus.
tsitaat:
Nii või naa, SSD'ga on elu hoopis teises dimensioonis. Siin põmst ei peagi koodi optimeerima.
Palun kustuta see väide oma postitusest - mõni veel loeb ja usubki. Kordan veelkord - riistvaraga ei saa kuidagi õige tarkvaralise lähenemise (andmemudel+päringute optimeerimine) vastu.
Kui teinekord on tõesti puudu just see viimased 10% jõudlusest, siis ehk on odavam riistvaraga punnitada aga 90+% juhtudest ei ole see ka siis õige lähenemine (vajadused kipuvad kasvama vms).
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
Le Inc
HV Guru
Le Inc

liitunud: 06.09.2002



Autoriseeritud ID-kaardiga

sõnum 21.12.2011 09:30:59 vasta tsitaadiga

.. selge see, et päringud peavad korras olema. Kindlasti korraliku RAID ketta paariga jookses sql nigu tuli takus. thumbs_up.gif Optimeerimine muutub vististi eriti tähtsaks suurte, mitmemiljoniliset kirjete puhul (a la facebuugid, google kama jne.). Eks kiirem raud annab rohkem andeks (selles oli mu eelmise postituse iva). Samas olgem ausad, kiirusevõit pole mitte "tsipa" vaid ikkagi s*taks suur, kui sa vaatad 4kb I/O teste siis saad aru millest ma räägin. boss.gif

Endal pikem kogemus puudub SSD ja samas ka korraliku ketta süsteemiga varustatud Oracle'ga. Nüüd MS 2008 R2 ja 11g 64bit (16GB mälu).
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 54
tagasi üles
vaata kasutaja infot saada privaatsõnum
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 21.12.2011 13:05:04 vasta tsitaadiga

Le Inc,
kui sa vaataks reaalsete süsteemide reaalset kõvaketta trace-i, siis saaksid aru, miks võit ei ole "s*taks suur". Mind häirib see haip SSD juures - ikka ja jälle tuuakse näiteks 4kb/32Q tulemusi adumata, et 32-ni ei jõua desktopi kasutaja paremagi tahtmise juures (Tomshardware testis hiljuti ja leidis, et isegi 2 on pigem harv näitaja) ja isegi serveritel on tegemist väga erilise olukorraga. Korrektselt kokku pandud serveri puhul töötab baas suuresti mälust - see on kordi kiirem, kui ka kiireim SSD. Ma ei ütle, et SSD võitu ei anna - midagi ikka annab. Sellele lootma jääda oleks aga suur rumalus. Lihtsalt tüüpiliselt on suurte baaside korral andmemassiivis märksa rohkem kui "RAID ketta paar" ja seetõttu ka võimalik võit SSD-le minnes väiksem.
Mis puudutab aga miljoni kirjega tabeleid, siis neid leidub ka meie kodumaral töötavates süsteemides hulgem. Esimene baas, kus "minu käe all" miljon täis sai, oli aga tollal veel suhteliselt väikese pagari/kulinaariatööstuse oma. Facebookid, googlid jms kama ei jookse enam "vana hea" relatsioonilise baasi peal. Need mootorid ei skaleeru piisavalt icon_wink.gif
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
b_alex
HV kasutaja
b_alex

liitunud: 22.02.2008




sõnum 21.12.2011 17:55:34 vasta tsitaadiga

tsitaat:
abi sql päringu optimeerimisel (või siis uue lahenduse leidmisel).
Tegu on menüü tabeliga, kust peaks teatud read igal korral lehele väljastama.

Mida üritan saavutada: Tabelist "mainmenu" valitakse pealkirja tüüp
(title_type - Väärtused: 0-Samast tabelist, pole php konstant, 1-Mooduli tabelist ID järgi


kas mingi tulemust ka testid, katsud, mis kiirem vms
, sekundides testi vms, teed kah?

_________________
O: HDD 2,5-3,5" - 2-4TB
Kommentaarid: 22 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 20
tagasi üles
vaata kasutaja infot saada privaatsõnum
Le Inc
HV Guru
Le Inc

liitunud: 06.09.2002



Autoriseeritud ID-kaardiga

sõnum 22.12.2011 13:00:55 vasta tsitaadiga

2korda2 kirjutas:
Le Inc,
kui sa vaataks reaalsete süsteemide reaalset kõvaketta trace-i, siis saaksid aru, miks võit ei ole "s*taks suur". Mind häirib see haip SSD juures - ikka ja jälle tuuakse näiteks 4kb/32Q tulemusi adumata, et 32-ni ei jõua desktopi kasutaja paremagi tahtmise juures (Tomshardware testis hiljuti ja leidis, et isegi 2 on pigem harv näitaja) ja isegi serveritel on tegemist väga erilise olukorraga. Korrektselt kokku pandud serveri puhul töötab baas suuresti mälust - see on kordi kiirem, kui ka kiireim SSD. Ma ei ütle, et SSD võitu ei anna - midagi ikka annab. Sellele lootma jääda oleks aga suur rumalus. Lihtsalt tüüpiliselt on suurte baaside korral andmemassiivis märksa rohkem kui "RAID ketta paar" ja seetõttu ka võimalik võit SSD-le minnes väiksem.
Mis puudutab aga miljoni kirjega tabeleid, siis neid leidub ka meie kodumaral töötavates süsteemides hulgem. Esimene baas, kus "minu käe all" miljon täis sai, oli aga tollal veel suhteliselt väikese pagari/kulinaariatööstuse oma. Facebookid, googlid jms kama ei jookse enam "vana hea" relatsioonilise baasi peal. Need mootorid ei skaleeru piisavalt icon_wink.gif

Sul võib täiesti õigus olla. Samas ei saa öelda et SSD põhine baas kiire ei oleks. icon_smile.gif
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 54
tagasi üles
vaata kasutaja infot saada privaatsõnum
spreiii
HV kasutaja

liitunud: 27.12.2008




sõnum 31.12.2011 02:06:08 vasta tsitaadiga

b_alex, lähipäevil üritan ära teha thumbs_up.gif
Hetkel asi täiesti toimib kogu süsteemi kõrval ning erilist kiirusekadu pole märganud (kogu lehe load time Netpointi serveris ~0,02-0,08 sec - mõõdetud PHPs microtime'i abiga). See aga kindlasti kuigipalju tõuseb, kuna mooduleid lisandub juurde.

Edit:

Niisiis, siin on lõpptulemus:
Query:
sql:
  1. SELECT mm.title_type, IF( mm.title_type =  '1', NULL , mm.custom_a ) AS custom_a, IF( mm.title_type =  '1', NULL , mm.custom_click ) AS custom_click, o.object_name AS object_name, m.short AS module_name, IF( mm.title_type =  '1', m.long, mm.title ) AS link_title
  2. FROM mainmenu mm
  3. LEFT JOIN objects o ON ( mm.object_id = o.object_id
  4. AND mm.title_type =  '1' )
  5. LEFT JOIN modules m ON ( mm.module_id = m.id
  6. AND mm.title_type =  '1' )
  7. WHERE mm.enabled =  '1'
  8. AND 0($user_level väärtus) >= level
  9. AND 0($user_level väärtus) <= level_max
  10. ORDER BY mm.position

EXPLAIN annab järgmise tulemuse:
Spoiler Spoiler Spoiler

Ja mitmeid kordi query't tehes sain tulemusteks:
Query took 0.0011 sec
Query took 0.0009 sec
Query took 0.0010 sec

Ja PHP's teen järgnevat:
php:
  1. if(mysql_num_rows($menu_q) > 0)
  2. {
  3.         while(($menu_r = mysql_fetch_assoc($menu_q)) != false)
  4.         {
  5.                 if($menu_r['title_type'] == 1)
  6.                 {
  7.                         $return .= '<a href="'.addr_home . addr_homedir . strtolower($menu_r['object_name']) . '/' . strtolower($menu_r['module_name']).'/"><ul><li>'.constant($menu_r['link_title']).'</li></ul></a>';
  8.                 }
  9.                 else
  10.                 {
  11.                         $return .= '<a href="'.addr_home . addr_homedir . strtolower($menu_r['custom_a']) .'" onclick="'.$menu_r['custom_click'].'"><ul><li>';
  12.                         if($menu_r['title_type'] == 0) $return .= $menu_r['link_title'];
  13.                         else { $return .= constant($menu_r['link_title']); }
  14.                         $return .= '</li></ul></a>';
  15.                 }
  16.         }
  17. } else $return .= "<ul><li>".lib_mainmenu_no_items."</li></ul>";
Kommentaarid: 23 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  MySQL päringu optimeerimine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.