Zadejte hledaný výraz...

Pomoc se zrychlením MySQL dotazu

David Flídr
verified
rating uzivatele
(22 hodnocení)
27. 5. 2019 19:46:47
Zdravím,
měl by někdo nápad jak přebudovat a zrychlit tento SQL dotaz? Mám 3 tabulky hotels (22k řádků), categories (273) a tours (690k), zpracování trvá cca od 0.8s až 1.2s, což se mi zdá hodně
díky za nápady
27. 5. 2019 19:46:47
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403389
Indexy nastavené máš?
27. 5. 2019 20:01:21
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403388
Petr Hejda
verified
rating uzivatele
(5 hodnocení)
27. 5. 2019 20:02:55
Jaký je výstup z explain?
27. 5. 2019 20:02:55
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403387
David Flídr
verified
rating uzivatele
(22 hodnocení)
27. 5. 2019 20:09:51
jj indexy mám, výstup z explain:
29110
27. 5. 2019 20:09:51
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403386
hm
verified
rating uzivatele
(20 hodnocení)
27. 5. 2019 21:01:09
Nejsem odbornik na databze, takze budu hadat -
Dela to ten subquery ve wheru, spusti se 22 tisickrat, aby se mohlo vyhodnotit jaky radky zobrazit a to proste trva. Asi bych to joinnul a groupnul podle hotel_id, asi to taky neni optimalni (nevim) ale aspon to nebude delat desetitisice subqueries
27. 5. 2019 21:01:09
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403385
David Flídr
verified
rating uzivatele
(22 hodnocení)
27. 5. 2019 21:13:07
Díky za snahu, je to o chlup rychlejší, ale ještě by to určitě chtělo vylepšit.
27. 5. 2019 21:13:07
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403384
hm
verified
rating uzivatele
(20 hodnocení)
27. 5. 2019 21:36:06
co zkusit joinnout ten subquery? nedelal yb se pak ani subquery ve vysledku a omezilo by to rapidne pocet joinovanych radek... mozna by to pomohlo... pisu z hlavy, neoveruju, tak muze obsahovat chyby
27. 5. 2019 21:36:06
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403383
David Flídr
verified
rating uzivatele
(22 hodnocení)
27. 5. 2019 21:42:22
tam je problém, že tabulka tour má skoro 700k záznamů a když se takto hodí join, tak zpracování trvá až 27s :)
27. 5. 2019 21:42:22
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403382
hm
verified
rating uzivatele
(20 hodnocení)
27. 5. 2019 21:48:28
Hm... No tak jsem moc nepomoh :) kdyby me neco napadlo, dam.vedet.
27. 5. 2019 21:48:28
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403381
Oleg
verified
rating uzivatele
(53 hodnocení)
27. 5. 2019 22:01:44
Zkus pouzit fce benchmark() a explain. Pohraj si s tim. Btw jakou verzi mysql mas?
27. 5. 2019 22:01:44
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403380
takatom
verified
rating uzivatele
(2 hodnocení)
28. 5. 2019 08:39:23
select hotels.id as h_id, hotels.name as h_name, hotels.main_image, hotels.stars,
hotels.rating, hotels.rating_count, hotels.gps, c.id as c_id, c.name as c_name,
c.url as c_url, c.id_parent, c.lft, c.level,
(select min(price) from tours where tours.id_hotel = hotels.id) as m_price
from categories c join hotels on hotels.id_category = c.id
where c.lft >= 123 AND c.rgt <= 164
and exists (SELECT id FROM tours WHERE id_hotel = hotels.id)
order by hotels.date_from, hotels.id asc limit 10 offset 0
Pokud to nebude dost rychlé:
ALTER TABLE hotels ADD INDEX hotels_category_date_from_id_index (id_category,date_from,id)
Anebo pokud oba dotazy vracejí stejnou množinu pro libovolný interval
(select id from category where lft >= 123 AND rgt <= 164)
(select id from category where id between 123 AND 164)
Doplnit do tabulky hotels atribut min_price
ALTER TABLE hotels ADD COLUMN (min_price DECIMAL)
ten se bude plnit trigrem nad tabulkou tours:
DELIMITER $$
CREATE TRIGGER tours_insert_trg
AFTER INSERT ON tours
FOR EACH ROW
begin
update hotels h set min_price = NEW.price where h.id = NEW.id_hotel AND (h.min_price IS NULL OR h.min_price < NEW.price;
end$$
CREATE TRIGGER tours_update_trg
AFTER UPDATE ON tours
FOR EACH ROW
begin
update hotels h set min_price = NEW.price where h.id = NEW.id_hotel AND (h.min_price IS NULL OR h.min_price < NEW.price;
end$$
DELIMITER ;
A celý dotaz se pak zjednoduší:
select hotels.id as h_id, hotels.name as h_name, hotels.main_image, hotels.stars,
hotels.rating, hotels.rating_count, hotels.gps, c.id as c_id, c.name as c_name,
c.url as c_url, c.id_parent, c.lft, c.level,
min_price as m_price
from hotels join categories c on hotels.id_category = c.id
where hotels.id_category BETWEEN 123 AND 164 AND min_price IS NOT NULL
order by hotels.date_from, hotels.id asc limit 10 offset 0
Pomocí EXPLAIN zkontrolovat, že se využije hotels_category_date_from_id_index
28. 5. 2019 08:39:23
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403379
David Flídr
verified
rating uzivatele
(22 hodnocení)
28. 5. 2019 09:05:13
díky, vyzkouším
28. 5. 2019 09:05:13
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403378
Oleg
verified
rating uzivatele
(53 hodnocení)
28. 5. 2019 10:23:48
@takatom napsal normalni reseni, btw.
@fida8 jakou verzi MySQL mas? V takovem poctu dotazu muze novejsi verze to cele zrychlit.
28. 5. 2019 10:23:48
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403377
David Flídr
verified
rating uzivatele
(22 hodnocení)
28. 5. 2019 15:22:08
je tam verze 5.0.12
28. 5. 2019 15:22:08
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403376
takatom
verified
rating uzivatele
(2 hodnocení)
1. 6. 2019 09:39:02
Dovíme se, jak to dopadlo?
1. 6. 2019 09:39:02
https://webtrh.cz/diskuse/pomoc-se-zrychlenim-mysql-dotazu/#reply1403375
Pro odpověď se přihlašte.
Přihlásit