Autor | Zpráva | ||
---|---|---|---|
davchy Profil |
#1 · Zasláno: 10. 11. 2014, 14:48:14
Zdravím,
jelikož nejsem programátor a co se týká dotazů, tak zvládnu vytvořit jen nějaké absolutně prostinké, potřeboval bych od nějaké dobré duše optimalizovat výtvor někoho jiného, kdy zpracování momentálně trvá cca 20 vteřin (a s narůstající tabulkou likes bude ještě hůře): $sql = "CREATE OR REPLACE VIEW odkazy AS SELECT * FROM links LEFT JOIN likes ON links.link_id=likes.like_link_id AND likes.like_email='" . $_SESSION['email'] . "' WHERE links.link_points='1' AND links.email<>'" . $_SESSION['email'] . "'"; if(!mysql_query($sql)){die('Chyba: ' . mysql_error());} $sql = "SELECT * FROM odkazy WHERE like_email IS NULL ORDER BY rand() LIMIT 12"; $result = mysql_query($sql); while ($row = mysql_fetch_array($result)) { echo '<div class="fbbox">'; ... echo '</div>'; } $sql = "DROP VIEW odkazy"; if(!mysql_query($sql)){die('Chyba: ' . mysql_error());} mysql_close(); CREATE TABLE IF NOT EXISTS `likes` ( `like_id` int(11) NOT NULL AUTO_INCREMENT, `like_link_id` int(11) NOT NULL, `like_email` varchar(255) COLLATE utf8_czech_ci NOT NULL, PRIMARY KEY (`like_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=21139 ; CREATE TABLE IF NOT EXISTS `links` ( `link_id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(60) COLLATE utf8_czech_ci NOT NULL, `url` varchar(255) COLLATE utf8_czech_ci NOT NULL, `email` varchar(255) COLLATE utf8_czech_ci NOT NULL, `link_points` int(11) NOT NULL, `added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`link_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=1625 ; V situaci jde o to, že uživatel identifikovaný $_SESSION['email'] má dostat předložen seznam dvanácti odkazů u kterých ještě nedal like a které nejsou jím zadané a které mají nastaveno aktivní zobrazování (hodnota 1 v link_points). Mockrát děkuji. |
||
jefitto44 Profil |
#2 · Zasláno: 10. 11. 2014, 14:55:27 · Upravil/a: jefitto44
A to mi chceš povedať, že kvôli tomu chceš furt zakladať novú tabuľku?! :O
Vieš si predstaviť, ako tá databáza bude vyzerať za týždeň, ak tam bude 1000 užívateľov? |
||
davchy Profil |
#3 · Zasláno: 10. 11. 2014, 14:58:43
Druhý kód je přiložen jen kvůli tomu, aby byla jasná struktura tabulek likes a links.
|
||
Kajman Profil |
davchy:
Myslím, že ne nesmysl dělat to view, které navíc může kolidovat mezi uživateli. Nad sloupcem like_email nemáte index a vyhledáváte podle něho (navíc bývá rychlejší uživatele identifikovat jejich číslem místo dlouhého e-mailu). Dále order by rand() je vysoce nevhodné pro větší počet řádků. Náhodné řádky to chce vymyslet nějak jinak. |
||
davchy Profil |
#5 · Zasláno: 10. 11. 2014, 15:25:00
Bohužel na to mé znalosti nestačí, celá aplikace je řešení od někoho jiného, na koho se již nedá nakontaktovat. Jediné co bych z těch tří věcí zvládl, je možná to přidání indexu. Nemohl byste prosím publikovat řešení alespoň toho prvního bodu, tedy vynechání view?
|
||
Kajman Profil |
#6 · Zasláno: 10. 11. 2014, 15:49:32
Bez view to bude takto nějak...
$sql = "SELECT o.* FROM links o LEFT JOIN likes l ON o.link_id = l.like_link_id AND l.like_email = '".mysql_real_escape_string($_SESSION['email'])."' WHERE o.link_points = 1 AND o.email <> '".mysql_real_escape_string($_SESSION['email'])."' AND l.like_email IS NULL ORDER BY Rand() LIMIT 12"; $result = mysql_query($sql); while ($row = mysql_fetch_array($result)) { echo '<div class="fbbox">'; ... echo '</div>'; } mysql_close(); A kromě zmíněného indexu, si udělejte i indexy na sloupci email a link_points ta tabulce links. Ale díky tomu rand() to bude čím dál pomalejší. Na rychlejší náhodný výběr si potom budete muset najmout nějakého bystřejšího programátora. |
||
davchy Profil |
#7 · Zasláno: 10. 11. 2014, 15:53:27
Mockrát Vám děkuji za ochotu.
|
||
Časová prodleva: 9 let
|
0