Autor Zpráva
davchy
Profil
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
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
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
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
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
Mockrát Vám děkuji za ochotu.

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: