Wildcard HTTPS certifikát zdarma ku každej doméne
Zobrazují se odpovědi 1 až 10 z 10

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

  1. 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ě.

    Kód:
    SELECT * FROM `items_loc` WHERE `locale` = "cs" AND `type_id` = 3 AND `value` = "odkaz-produkt-7"
    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.

  2. Co se právě děje na Webtrhu?
  3. Index tam je?

  4. co tam mas za indexy, co pise explain?

  5. 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.

  6. 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.

  7. Začni optimalizaci tím, že budeš používat názvy sloupců a cache.

  8. 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.

  9. Citace Původně odeslal ItSnowsInHellAgain Zobrazit příspěvek
    Začni optimalizaci tím, že budeš používat názvy sloupců a cache.
    Pouzit nazvy sloupcu? Muzes mi to objasnit?

  10. Citace Původně odeslal musil.david Zobrazit příspěvek
    Pouzit nazvy sloupcu? Muzes mi to objasnit?
    https://softwareengineering.stackexchange.com/a/234663
    https://stackoverflow.com/a/3640051

  11. 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.

Hostujeme u Server powered by TELE3