Optimalizace Mysql query rubrika: Databáze: SQL

3 jan_4
položil/-a 19.6.2015
 
upravil/-a 19.6.2015

Ahoj,

trochu jsem se zasekl a potřeboval bych poradit.

Mam poměrně jednoduchou query nad MySQL:

select COUNT(DISTINCT email), event from log where article_id = 9 group by event

15834 click
41000 read
.....

Čímž získám počet unikátních přečtení / kliknutí na článek, jenomže prý je v Mysql bug a tahle query zabere na tabulce s milionem zázanmů asi 12 vteřin (email, event i article_id je indexováno).

"Select count(distinct somefield) from sometable is very slow in all versions of mysql.
The distinct part is equivalent to:
select somefield from sometable group by somefield
although the latter sometimes runs even faster than distinct. To get reasonable speed under mysql5, please use this equivalent which uses a subquery:

select count(*) from (select distinct somefield from sometable group by somefield) as somelabel;

This is quite speedy.

(I don't know why count distinct is so slow when distinct itself isn't that slow.)"

Nevíte jak podobnou query optimalizovat aby byla rychlejší?

Díky za rady.

odkaz Vyřešeno
6 Žížala
odpověděl/-a 22.6.2015

Ty jo, jsem netušil, že je na tom MySQL tak zle. Ale v tomhle případě bych udělal asi to, že bych si:

  • Vytvořil tabulku, která bude obsahovat zobrazovaný výsledek
  • V tabulce bude id/časové razítko posledního zpracovaného záznamu
  • Pak jsou možné dva scénáře:
    1. Za chodu se od daného razítka dopočítá zbytek a ten se sečte, aktulizuje se mezitabulka a zobrazí výsledek. Přesná metoda, ale pomalejší na frontendu.
    2. Pomocí cronu se bude dopočítávat od daného razítka a aktualizovat mezitabulka. A bude se trochu nepřesně zobrazovat výsledek. Rychlé na frontendu

Komentáře

  • jan_4 : Tohle je pro mě pravděpodobné řešení. 22.6.2015

Pro zobrazení všech 9 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.