Autor Zpráva
Cipísek055
Profil *
Zdravím,

mám takový dotaz, Chtěl bych nějak optimalizovat načítání dat na webu z databáze, jelikož aktuálně mi to načítá strašně dlouho.
(záznamů v tabulce data je cca 40 000)

Tabulka "data"
------------------------------
id (AI, PK)
name 
url
table
..


tabulka data_images
------------------------------
id (AI, PK)
data_id (z tabulky "data.id")
directory


tabulka g_123, g_755
----------------
id,
data_id,
text,
info,
a
b
...


V tabulce "data" mám propojení s data_images (zde jsou obrázky/většinou jeden)
v tabulce "g_123" (takových je více) jsou doplńující data k tabulce "data".

V tabulce "data" je sloupec "table" -> dle něj se zjišťuje, v jaké tabulce má doplňující data (např. "g_123")
Pro výpis v PHP mám funkci - vypisuji po 30 záznamech, i tak čekám někdy i 3 minuty, server i připojení je velké.

public function data() {
            
            $i=0;
            
            $this->getObjects   = "";
            $start              = 0;
            $max                = 30;

            $this->data_cmd  = "
                            SELECT object.*, timg.dir AS images FROM data object
                                LEFT JOIN data_images timg ON timg.data_id = object.id
                                    WHERE object.sv_block=0
                                        ORDER BY object.created 
                                            DESC LIMIT $start, $max";  
 

            $this->qPar = mysqli_query( $this->data_cmd );
            while($this->gObj = mysqli_fetch_array($this->qPar)) {

                $this->getObjects[$i] = array(
                    
                    "id" => $this->gObj["id"],      
                    "ab" => $this->gObj["ab"],
                    "name" => $this->gObj["name"],
                    "data" => DCMD("SELECT * FROM {$this->gObj["table"]} WHERE data_id='".$this->gObj["id"]."' ;"),
                    "images" =>  $this->gObj["images"],
                    "created" => $this->gObj["created"],       
                );

                $i++;
                
            }
            
            return $this->getObjects;
            
            
}
Tomášeek
Profil
Cipísek055:
Chybou je ten vnořený dotaz, který voláš v cyklu. I když, i tak, 3 minuty by to při 30 záznamech (a tedy 30 dotazech) nedělalo.
juriad
Profil
„V tabulce "data" je sloupec "table" -> dle něj se zjišťuje, v jaké tabulce má doplňující data (např. "g_123")“
To není škovné.

Kvůli tomu, že máš špatně navrženou strukturu není možné provést JOIN, což tě nutí pokládat hromadu dotazů.

Ještě se zeptám:
Máš index na sloupci data_id v tabulce g_123 (a všech dalších doplňujících)? Pokud ne, přidej ho (je).

Pokud je pomalý i ten první dotaz, nespíš ti tam také chybí vhodný dotaz.
Cipísek055
Profil *
Jak by jsi to řešil ? Tabule typu g_123 je spouta (123 je prefix) ...

resp. je tam cca milion zaznamu v ruznych tabulkach, proto jsou zaznamy rozdeleny do prefixovych tabulek.
Jen me nenapada, jak spravne resit to propojeni tabulky data s pod-tabulkou.
Kdybych mel data v jedne tabulce na misto tabulek g_123, tak by tam bylo milion zaznamů...
juriad
Profil
Cipísek055:
Takže ty tabulky g_* jsou stejné či velice podobné a slouží jen k tomu, aby v jedné tabulce nebyly miliony záznamů? Databáze jsou na takové objemy dat navržené a se správnými indexy jsou dotazy svižné.
Tato diskuse má více než 1 milion příspěvků a je stále svižná.
Cipísek055
Profil *
Zkusím to vymyslet jinak, tu strukturu.

Každopádně děkuji za Vaše rady.
pcmanik
Profil
Cipísek055:
Nevymýšlaj, radšej nám ukáž tvoju aktuálnu a čo chceš dosiahnuť a my ti už poradíme.

Teda ak to neni tajné :)

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