Zadejte hledaný výraz...

Jednoduchý SELECT * WHERE na 60 milonech záznamů

David Musil
verified
rating uzivatele
(69 hodnocení)
28. 11. 2017 18:05:07
Ahoj,
nejsem velký odborník na databáze a rád bych získal radu. Dostal jsem se k projektu kde potřebuji provést select, který ověřují platnost odkazu směřující na detail produktu na eshopu. Zkrátka zda se ukáže stránka s detailem produktu, nebo vyskočí stránka typu 404. Tabulka má asi 60 mil. záznamů a má 5 sloupců. Tabulka reprezentuje přeložitelné údaje k produktům. Tedy titulek, popisky a URL.
id | item_id (FK) | locale (FK) | type_id (FK) | value
hodnoty např.:
3 | 3 | cs | 1 | Název třetího produktu
3 | 3 | cs | 2 | odkaz-produkt-3
3 | 3 | cs | 3 | Popisek třetího produktu
7 | 7 | cs | 1 | Název sedmého produktu
7 | 7 | cs | 2 | odkaz-produkt-7
7 | 7 | cs | 3 | Popisek sedmého produktu
Dotaz tedy vypadá třeba takto. Ovšem dvě minuty na proces vyhledávání je přecijen hodně.
Formát MySQL InnoDB. Je to VPSka, dva procesory 8GB RAM na Wedosu. Ale nevěřím, že by to byl pouze technický problém kvůli HW.
locale: char(2) (proveden add index)
type_id: tinyint(3) (proveden add index)
value: text (proveden add fulltext)
Díky všem za rady.
28. 11. 2017 18:05:07
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314640
Jersák Martin
verified
rating uzivatele
(23 hodnocení)
28. 11. 2017 18:07:26
Index tam je?
28. 11. 2017 18:07:26
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314639
hm
verified
rating uzivatele
(20 hodnocení)
28. 11. 2017 18:07:45
co tam mas za indexy, co pise explain?
28. 11. 2017 18:07:45
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314638
vlnk
verified
rating uzivatele
(4 hodnocení)
28. 11. 2017 18:49:34
cs ani type_id nepřinesou zrychlení, protože dělí data na málo skupin.
Fulltext není vhodný pro rychlé vyhledávání a nenachází nutně všechny položky.
Vytvořte indexovaný sloupec varchar, který naplníte hledanou hodnotou. (Moc se nehodí kilometrové hezké odkazy.) Bylo by dobré, kdyby šlo použít např. 20-30 znaků ze začátku textu.
28. 11. 2017 18:49:34
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314637
David Musil
verified
rating uzivatele
(69 hodnocení)
28. 11. 2017 19:02:33
Explain nyni nemam moznost vyzkouset, nejsem u PC. Kazdopadne je pravda, ze indexy tam nyni nebudou. Napada me unikatni, ale to myslim, ze nepujde kvuli tomu, ze url pro jazykove mutace jsou stejne.
28. 11. 2017 19:02:33
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314636
Začni optimalizaci tím, že budeš používat názvy sloupců a cache.
28. 11. 2017 20:14:08
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314635
_Antik_
verified
rating uzivatele
(22 hodnocení)
28. 11. 2017 20:31:32
Vytvor index na vsechny sloupce v dotazu tzn. jeden klic (locale, type_id, value), rozdelene klice jako mas ted jsou u tohoto dotazu k nicemu.
28. 11. 2017 20:31:32
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314634
David Musil
verified
rating uzivatele
(69 hodnocení)
28. 11. 2017 23:47:26
Napsal ItSnowsInHellAgain;1426847
Začni optimalizaci tím, že budeš používat názvy sloupců a cache.
Pouzit nazvy sloupcu? Muzes mi to objasnit?
28. 11. 2017 23:47:26
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314633
Napsal musil.david;1426881
Pouzit nazvy sloupcu? Muzes mi to objasnit?
https://softwareengineering.stackexchange.com/a/234663
https://stackoverflow.com/a/3640051
29. 11. 2017 00:55:31
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314632
indy.cz
verified
rating uzivatele
29. 11. 2017 08:49:56
1. Zvednul bych inodb buffery na maximalni moznou hodnotu.
2. Vytvořil bych ještě jeden sloupec s pevnou délkou - char(32) - valuehash, nad ním index a do něj uložil md5(UPPER(value))
update table_xx set valuehash = md5(upper(value))
Ano, bude to chvíli trvat a DB naroste asi o 2GB.
O případně další plnění valuehash při změnách v table by se staral trigger.
A potom bych selektoval na md5(upper(value))
SELECT * FROM `items_loc` WHERE `locale` = "cs" AND `type_id` = 3 AND `valuehash` = md5(upper("odkaz-produkt-7"))
Prakticky jde udelat jeden index pres locale, type_id a valuehash, ale to uz otestovat explain.
Výsledkem by měl být dotaz v řádu několika málo milisec.
29. 11. 2017 08:49:56
https://webtrh.cz/diskuse/jednoduchy-select-where-na-60-milonech-zaznamu#reply1314631
Pro odpověď se přihlašte.
Přihlásit