Autor | Zpráva | ||
---|---|---|---|
Cipísek055 Profil * |
#1 · Zasláno: 16. 3. 2017, 16:16:09
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 |
#3 · Zasláno: 16. 3. 2017, 16:27:39
„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 * |
#4 · Zasláno: 16. 3. 2017, 16:31:22
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 |
#5 · Zasláno: 16. 3. 2017, 16:42:08
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 * |
#6 · Zasláno: 16. 3. 2017, 16:53:16
Zkusím to vymyslet jinak, tu strukturu.
Každopádně děkuji za Vaše rady. |
||
pcmanik Profil |
#7 · Zasláno: 16. 3. 2017, 19:04:33
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é :) |
||
Časová prodleva: 6 let
|
0