Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  Küsimus MySQLi päringu kohta 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:  
Stemugram
HV kasutaja

liitunud: 02.12.2001




sõnum 13.10.2010 13:27:36 Küsimus MySQLi päringu kohta vasta tsitaadiga

Mul on kaks tabelit
aastad
raamatuID    aasta  lkr
EAA.3154.2.1 1923  125
EAA.3154.2.2 1925  85
EAA.1219.2.1 1854  545

kohad
kohaID    koht
EAA.3154  Hageri
EAA.1219  Rapla

Päringus peab siis teise tabeli kohaID võrduma esimese tabeli raamatuID 8 esimese sümboliga.
Päring on selline
SELECT DISTINCT koht FROM kohad JOIN aastad WHERE kohad.kohaID=LEFT(aastad.raamatuID,8) ORDER BY koht
aga see on jube aeglane (1.3636 sek), aeglaseks teeb see LEFT(aastad.raamatuID,8)

Kuidas seda päringut kiiremaks saada?

Kas ainus variant on selline, et lisan esimesse tabelisse ühe veeru veel, kuhu siis lisan selle teise tabeli kohaID
ehk selliselt:
raamatuID    kohaID   aasta lkr
EAA.3154.2.1 EAA.3154 1923  125

Nii tuleks päringu kiiruseks 0.0057 sek

Kas on veel mingeid variante?
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
ref
Kreisi kasutaja

liitunud: 10.08.2003




sõnum 13.10.2010 16:01:19 vasta tsitaadiga

Indeksi lisamine peaks veidi aitama...


CREATE INDEX raamatuid_idx ON aastad(raamatuid);


Võid proovida ka konkreetselt esimese 8 märgi indekseerimist (kuid kahtlustan, et see ei too soovitud tulemust).

Parim (kiireim) lahendus olekski tolle lisaveeru tekitamine (+ indeks peale)... Afaik peaks InnoDB baasimootor triggereid toetama, ehk siis võid baasi poolele BEFORE INSERT triggeri lisada, mis tolle vajaliku veeru tekitab


delimiter |

CREATE TRIGGER lisa_kohaid BEFORE INSERT ON aastad
  FOR EACH ROW BEGIN
    SET NEW.kohaid = LEFT(NEW.raamatuid, 8);
  END;
|


Viimase asja töötamiseks võiks MySQL olla 5.0 või uuem...
Kommentaarid: 17 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 15
tagasi üles
vaata kasutaja infot saada privaatsõnum
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 14.10.2010 13:59:56 vasta tsitaadiga

Mina teeks mõlemasse tabelisse lisaveeru, täisarv tüüpi. Ülemises tabelis nimetus ID, oleks ühtlasi PK. Alamtabelis lisaveeru nimeks aastad_id ja veerule paneks FK. Väga lihtne ja selge.
ref soovitatud keemia ei taga andmekoosseisu korrektsust (kustutatakse kirje tabelist AASTAD aga jäävad rudimendid tabelisse KOHAD). Kasutagem relatsioonilist andmebaasi moel, milleks ta mõeldud on!

edit: vaatasin veelkord tabelite struktuuri ja ma kahtlen, kas viide sai ikka õiget pidi. Äkki peaks raamat viitama kohale? Igal juhul on FK vajalik.
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
mirko28
Aeg maha 1p
mirko28

liitunud: 31.12.2003




sõnum 14.10.2010 16:08:00 Re: Küsimus MySQLi päringu kohta vasta tsitaadiga

kohad.kohaID=LEFT(aastad.raamatuID,8)


Nagu soovitati, siis tuleks teha nii nagu relatsioonilisele andmebaasile kohane. Tulemuseks peaks olema JOIN-i osa ka loetav selgelt, mitten ii nagu praegu, et ühelpool JOINI-i võrdust asub fraas "kohad" ja teisel pool asub fraas "raamatud". mõlemale poole võrdust peaks jääma miskit sellist:

esimene.ID=teine.esimeneID


Hakkasin mõtlema, et mida siis kasu võiks anda sedalaadi relatsioon, mis nagu "krüpteeritud" on, ala:

esimene.ID=Decrypt(teine.esimeneID, 'SecretKey')

või lausa ka loetamatute veergude nimede korral:
esimene.TundmatuVeerg1=Decrypt(teine.TundmatuVeerg2, 'SecretKey')


Et sel juhul andmebaasis välisvõtmeid pole, mis raskendab andmebaasi mudeli mõistmist, ja kui veerunimed ka sisukad pole nagu teise näitep uhul, siis on veel raskem mõista, millised veerud on relatsiooni-seoses, ja kui veel JOINItavates veergudes on krüpteeritud väärtused, ja päringud, mis neid joine-e tutvustavad on eemale viidud kuhugile tarkvara teise kihti, siis andmebaasi varastajal on väga raske andmeid mõista ilmselt, see peaks olema sellise lahenduse kasutegur ilmselt. Selline lahendus töötaks ilmselt hea jõudlusega vaid siis kui andmebaas oleks väga väheste andmetega.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  Küsimus MySQLi päringu kohta
[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.