Autor Zpráva
pcmanik
Profil
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
Tori:
Ďakujem už je to lepšie, avšak tabuľka konverzacie sa stále prehľadáva celá.
Tori
Profil
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
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
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
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0