Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Optymalizacja z pozoru prostego problemu
Forum PHP.pl > Forum > Bazy danych > MySQL
mudek
Witam,


Próbuję zoptymalizować zapytanie


select COUNT(*) from L where LID IN
(select LID from L_status where LSCID < 3 AND LSCID > 0) AND LID NOT IN
(select LID from L_status where LSCID > 3 AND LSCID < 6) ;


Jego celem jest selecja rekordow z tabeli
L uzalezniona od istnienia okreslonych
statusów.


Np wszystkie rekordy z L które posiadaja
status 1 lub 2 ale nie posiadaja statusu
5 lub 6.








Są 2 tabelki


1)
CREATE TABLE `L` (
`LID` int(10) NOT NULL auto_increment,
.
.
.
KEY `LID` (`LID`)
)





2)
CREATE TABLE `L_status` (
`LSID` int(10) NOT NULL auto_increment,
`LSCID` int(10) NOT NULL default '0',
`LID` int(10) NOT NULL default '0',
KEY `LSID` (`LSID`),
KEY `LID` (`LID`),
KEY `LSCID` (`LSCID`)
)




Tabelka 2 zawiera statusy do tabelki 1
w tabelce 1 jest ok 16K rekordow
w tabelce 2 tez jest ok 16 K rekordow.














Przy tej liczbie rekordów stanowi to waskie gardło systemu.


Usiluje zoptymalizować to zapytanie i dochodze do wniosku
iż jedynym rozwiazniem jest

1) Dodanie tabelki ze statusami i JOIN na nich




2) Alternatywa dla zapytania z MINUS ktorego nie obsluguje
mysql


(select LID from L_status where LSCID < 3 AND LSCID > 0)
MINUS
(select LID from L_status where LSCID > 3 AND LSCID < 6)





Dziekuję za sugestie.


Pozdrawiam
Grzegorz
dr_bonzo
1. wrzuc kod SQL w odpowiednie bbCode ( [sql])
2. po co tyle pustych linii?questionmark.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.