Autor | Zpráva | ||
---|---|---|---|
pcmanik Profil |
#1 · Zasláno: 15. 9. 2012, 17:12:38
Zdravím,
napísal som si tento dotaz na overenie existencie konverzácie medzi dvomi užívateľmi. SELECT k.id_konverzacie FROM konverzacie k LEFT JOIN ( SELECT GROUP_CONCAT(id_uzivatela) AS spojene, id_konverzacie FROM konverzacie GROUP BY id_konverzacie ) c ON c.id_konverzacie = k.id_konverzacie WHERE (id_uzivatela = 1 OR id_uzivatela = 3) AND spojene = '1,3' LIMIT 1 Avšak zdá sa mi to nie príliš efektívne riešenie, nakoľko musí databáza 2 krát prejsť celú tabuľku konverzacie a nemôže využiť indexy, resp. ich využije ale aj tak podľa explainu prechádza cez všetky riadky. Dá sa nejak dotaz zoptimalizovať? Alebo mám zlý návrch databázy? CREATE TABLE `konverzacie` ( `id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `id_konverzacie` SMALLINT UNSIGNED NOT NULL, `id_uzivatela` SMALLINT UNSIGNED NOT NULL, INDEX (`id_konverzacie`, `id_uzivatela`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
||
Tori Profil |
Nešlo by to nějak s EXISTS?
SELECT DISTINCT k.id_konverzacie FROM konverzacie k WHERE EXISTS (SELECT * FROM konverzacie i1 WHERE i1.id_konverzacie = k.id_konverzacie AND i1.id_uzivatela = 1) AND EXISTS (SELECT * FROM konverzacie i2 WHERE i2.id_konverzacie = k.id_konverzacie AND i2.id_uzivatela = 3) |
||
pcmanik Profil |
#3 · Zasláno: 15. 9. 2012, 17:40:28
Tori:
Ďakujem už je to lepšie, avšak tabuľka konverzacie sa stále prehľadáva celá. |
||
Tori Profil |
#4 · Zasláno: 15. 9. 2012, 17:42:40
pcmanik:
Přidejte indexy i na zbývající dva sloupečky (na každý samostatně). |
||
pcmanik Profil |
Tori:
Bohužial nepomohlo, explain vyzerá takto: id select_type table type possible_keys key key_len ref rows extra 1 PRIMARY k index NULL id_konverzacie 4 NULL 4 Using where; Using index Pričom v tabuľke konverzácie sú práve 4 riadky a logicky by ich malo prehľadať len dva nie? Na poddotazy sa index použíje správne. |
||
Tori Profil |
#6 · Zasláno: 15. 9. 2012, 18:02:57
pcmanik:
No ale MySQL neprochází data, ale pouze index, takže to je rychlejší. Možná je rozdíl i v tom, že klíč na sloupci id_konverzacie není unikátní, nevím. Zkusila bych to s větším objemem dat. Anebo někdo jiný poradí lépe. :) |
||
pcmanik Profil |
#7 · Zasláno: 15. 9. 2012, 18:07:08
Tori:
Ďakujem veľmi pekne za radu :) Takže to znamená, že síce prechádza 4 riadky, ale len v indexe, resp. nemusí nijak pracovať s dátamy a tým pádom je to aj tak vcelku rýchle? Chápem to správne? A unikátny klúč byť nemôže, nakoľko sa tam môže viac krát vyskytovať rovnaké id_konverzacie. |
||
Kajman Profil |
#8 · Zasláno: 17. 9. 2012, 12:44:42
Když se přidá dvousloupcový index (id_uzivatela, id_konverzacie), tak by mohlo být svižné
SELECT k.id_konverzacie FROM konverzacie k JOIN konverzacie k2 ON k.id_konverzacie = k2.id_konverzacie AND k2.id_uzivatela = 3 WHERE k.id_uzivatela = 1 LIMIT 1 |
||
Časová prodleva: 12 let
|
0