praegune kellaaeg 18.06.2025 15:34:00
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
Stemugram
HV kasutaja
liitunud: 02.12.2001
|
13.10.2010 13:27:36
Küsimus MySQLi päringu kohta |
|
|
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 |
|
 |
ref
Kreisi kasutaja
liitunud: 10.08.2003
|
13.10.2010 16:01:19
|
|
|
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 |
|
 |
2korda2
HV kasutaja
liitunud: 19.07.2003
|
14.10.2010 13:59:56
|
|
|
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 |
|
 |
mirko28
Aeg maha 1p

liitunud: 31.12.2003
|
14.10.2010 16:08:00
Re: Küsimus MySQLi päringu kohta |
|
|
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 |
|
 |
|
lisa lemmikuks |
|
|
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.
|