» »

[MySQL] Rabim hitrejšo SQL poizvedbo za 3 tabele!

[MySQL] Rabim hitrejšo SQL poizvedbo za 3 tabele!

shorvat ::

Lep pozdrav,

imam sledeče 3 tabele

----------------------
| m_lista |
----------------------
| id | email |
----------------------
| 1 | janez@g |
| 2 | krnjski@g.g |
| 3 | jaijij@g.gg |
----------------------

v zgornji tabeli je polje email UNIQUE

---------------------------
| uporabniki |
---------------------------
| id | ime | email |
---------------------------
| 1 | gz | janez@g |
| 2 | jk | jk@g |
| 3 | jk | janez@g |
---------------------------

v zgornji tabeli so emaili lahko tudi podvojeni, potrojeni (en email naslov lahko nastopa v več vpisih)

---------------------------
| dostopi |
---------------------------
| id_uporabniki | status |
---------------------------
| 1 | 99 |
| 2 | 1 |
| 3 | 99 |
---------------------------

tabeli 'dostopi' in 'uporabniki' imata enako število vpisov in sta povezani preko uporabniki.id = dostopi.id_uporabniki

rabim pa sledeč izpis:

maili, ki so v tablei 'm_lista' in hkrati v tabeli 'uporabniki' ki imajo status 99 v tabeli 'dostopi'

se pravi, odprade vpis, ki ima id in id_uporabnika 2 (zato ker je ta email na statusu 1)

v tem primeru bi bil pravilen rezultat:

----------------------
| email |
----------------------
| janez@g |
----------------------

Tabele so kompleksnejše, ampak nepotrebnih podatkov nisem dopisoval, ker niso ključnega pomena. SQL stavek, ki mi da pravilen rezultat je takšen:

SELECT m_lista.email FROM m_lista JOIN
(
SELECT DISTINCT(u.email) FROM uporabniki u JOIN dostop.d ON u.id=d.id_uporabniki
WHERE d.status='99'
) AS x ON x.email=m_lista.email

Problem je pa v tem, ker se ta poizvedba izvaja 3 minute. Naj omenim še, da je v vsaki tabeli cca. 30.000 vpisov. Verjetno bi se dalo kaj narediti s pomočjo EXISTS, ampak mi ta zadeva ni kaj preveč razumljiva (če sta v igri samo dve tabeli, potem mi logika z EXISTS še špila)

hvala, sašo
  • spremenil: shorvat ()

fosil ::

Včasih pomaga, če daš na koncu vsakega selecta še sort by id.
Probaj.
Tako je!

Zgodovina sprememb…

  • spremenil: fosil ()

NavadniNimda ::

SHORVAT: pozabil si povedati, katere indexe si naredil nad tabelami. Ko boš to povedal, lahko gremo tuhtati naprej! :|

BigWhale ::

Database redesign? ;)

PS: Vcasih se splaca en podatek hraniti v dveh tabelah hkrati. Nepredstavljivo za marsikoga ampak precejkrat pohitri dostope do podatkov. Joini in subselecti so costly! :)

Zgodovina sprememb…

  • spremenil: BigWhale ()

tonic ::

se pridružujem BigWhale-ovemu postu

shorvat ::

Razdelil bom zadevo v dva query-ja in preko php-ja primerjal podatke.

Vseeno pa me zanima, če kdo poznam optimalnejši SQL stavek za to poizvedbo.

hvala, lp, sašo

BigWhale ::

> Razdelil bom zadevo v dva query-ja in preko php-ja primerjal podatke.

To je verjetno se pocasnejsi nacin. ;)

Ki bi pa lahko dal boljsi rezultat, ce je application server druga masina kot DB server.

shorvat ::

zadeva je veliko hitrejša. pa dostop do tabel je zelo hitro sproščen.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

pomoč v MS access - filtriranje, zaščita baze, dodeljevanje uporabnikov in pravic

Oddelek: Programiranje
101226 (1072) dvojka
»

PHP prikaz objav od prijateljev

Oddelek: Izdelava spletišč
7848 (655) Ziga Dolhar
»

MS SQL Management studio baza

Oddelek: Programiranje
9891 (788) detroit
»

[PostgreSQL] PgAdmin kreiranje tabel

Oddelek: Programska oprema
61046 (1000) Poldi112
»

[MySql] obratno od DISTINCT

Oddelek: Programiranje
101394 (1212) frudi

Več podobnih tem