Forum » Programiranje » [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
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.
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! :)
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 ()
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
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.
To je verjetno se pocasnejsi nacin. ;)
Ki bi pa lahko dal boljsi rezultat, ce je application server druga masina kot DB server.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | pomoč v MS access - filtriranje, zaščita baze, dodeljevanje uporabnikov in pravicOddelek: Programiranje | 1328 (1174) | dvojka |
» | PHP prikaz objav od prijateljevOddelek: Izdelava spletišč | 930 (737) | Ziga Dolhar |
» | MS SQL Management studio bazaOddelek: Programiranje | 961 (858) | detroit |
» | [PostgreSQL] PgAdmin kreiranje tabelOddelek: Programska oprema | 1106 (1060) | Poldi112 |
» | [MySql] obratno od DISTINCTOddelek: Programiranje | 1457 (1275) | frudi |