[php,sql] c-plusplus.de forum index schneller machen


  • Mod

    der phpbb code scheint mir ein graus zu sein...

    ich wuerde es brutal machen:

    eine neue tabelle erstellen die exakt soviele eintraege hat wie wir foren.
    bei jedem neuen posting wird brutal ein update ausgefuehrt unnd setzt in dieser tabelle den titel des letzten postings.
    da kannst du uhrzeit und user id auch dazu geben, dann bist du extrem schnell, da du mit einem query alles bekommst.

    allerdings musst du dann die struktur aendern, was sich aber IMHO auszahlt. denn ich wuesste nicht wie man es anders effektiv schaffen koennte.



  • Shade Of Mine schrieb:

    der phpbb code scheint mir ein graus zu sein...

    ich wuerde es brutal machen:

    eine neue tabelle erstellen die exakt soviele eintraege hat wie wir foren.
    bei jedem neuen posting wird brutal ein update ausgefuehrt unnd setzt in dieser tabelle den titel des letzten postings.
    da kannst du uhrzeit und user id auch dazu geben, dann bist du extrem schnell, da du mit einem query alles bekommst.

    allerdings musst du dann die struktur aendern, was sich aber IMHO auszahlt. denn ich wuesste nicht wie man es anders effektiv schaffen koennte.

    ungern, denn das bedeutet viele eingriffe in den orginal code, was sich negativ beim updaten auswirkt



  • Sollten doch nur 2 Eingriffe sein? Einmal dort wo Posting in Empfang genommen wird und einmal auf der Index-Seite.

    Man muss ja nicht unbedingt eine Datenbank nehmen. Für jedes Forum eine eigene Textdatei sollte doch auch gehen, oder?

    Also z.B. f_1.txt:

    ie starten
    abcqurz
    16 Jul 2003 07:54
    MuehBln
    

    Am Besten 2 Funktionen schreiben und die in eine separate Datei packen (z.B. SetLastPosting(forum)undGetLastPosting(forum) und GetLastPosting(forum). Das kann man dann ja schnell wieder rein/rausbauen.

    btw: C/C++ Code und Code haben die selbe Tastenkombination (Alt+c)



  • Dimah schrieb:

    Shade Of Mine schrieb:

    der phpbb code scheint mir ein graus zu sein...

    ich wuerde es brutal machen:

    eine neue tabelle erstellen die exakt soviele eintraege hat wie wir foren.
    bei jedem neuen posting wird brutal ein update ausgefuehrt unnd setzt in dieser tabelle den titel des letzten postings.
    da kannst du uhrzeit und user id auch dazu geben, dann bist du extrem schnell, da du mit einem query alles bekommst.

    allerdings musst du dann die struktur aendern, was sich aber IMHO auszahlt. denn ich wuesste nicht wie man es anders effektiv schaffen koennte.

    ungern, denn das bedeutet viele eingriffe in den orginal code, was sich negativ beim updaten auswirkt

    update wird ja wohl nicht mehr nötig sein 👎


  • Mod

    Dimah schrieb:

    ungern, denn das bedeutet viele eingriffe in den orginal code, was sich negativ beim updaten auswirkt

    ja, das ist leider der nachteil 😞

    aber ich habe mich gestern 1 stunde mit dieser datenbank sttruktur gespielt -> ich habs nicht hinbekommen mit dieser struktur den letzten beitrag effizient auszulesen.

    du kannst ja auch mal auf phpbb.com nachfragen wie man das effizient machen kann.

    wie gesagt, dass ist der einzige weg der mir eingefallen ist -> hoffentlich findet noch jemand einen besseren!



  • Vielleicht solltet ihr es doch mal mit nem Index auf die größeren Tabellen machen. Die Spalten die in dem SQL vorkommen halt in Kombination



  • Warum nicht einfach für jedes Forum eine schöne Tabelle - das ist ja kein Problem?! Und da lässt man dann brav einen Index mitlaufen (Unique oder so) und ruft einfach Element #1 für jede Tabelle auf?

    Außerdem erleichtert das das Suchen in einzelnen Foren!

    MfG SideWinder



  • kann man performancekritische Sachen nicht in C++ schreiben?



  • 🙂

    Die SQL-Abfrage ist zeitkritisch, und mySQL ist doch in C++ geschrieben.

    Ein Join über soviele Tabellen dauert... egal ob VB, C++ oder PHP.


  • Mod

    Marc++us schrieb:

    🙂
    Ein Join über soviele Tabellen dauert...

    eben 😞
    deshalb sehe ich keine andere moeglichkeit als die tabellenstruktur zu aendern 😞



  • ich habe es jetzt so gelöst

    default:
    			$sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id
    				FROM (( " . FORUMS_TABLE . " f
    				LEFT JOIN " . POSTS_TABLE . " p ON p.post_id = f.forum_last_post_id )
    				LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id )
    				ORDER BY f.cat_id, f.forum_order";
    			break;
    	}
    	if ( !($result = $db->sql_query($sql)) )
    	{
    		message_die(GENERAL_ERROR, 'Could not query forums information', '', __LINE__, __FILE__, $sql);
    	}
    
    	$forum_data = array();
    	while( $row = $db->sql_fetchrow($result) )
    	{
    		$forum_data[] = $row;
    	}
    
    	if ( !($total_forums = count($forum_data)) )
    	{
    		message_die(GENERAL_MESSAGE, $lang['No_forums']);
    	}
    
    //Dimah
    
    function gecachter_last_topic_on_index()
    {
        static  $topic_data = array();
        global  $forum_data, $total_forums, $db;
    
        $orig_word = array();
        $replacement_word = array();
        obtain_word_list($orig_word, $replacement_word);
    
        for($i = 0; $i < $total_forums; $i++)
        {
            if ( $forum_data[$i]['cat_id'] == 7)
            {
                $topic_data[$i]['topic_title_full'] = "&nbsp;Archiv - hier kann nur gelesen werden";
                $topic_data[$i]['topic_title_short'] = "&nbsp;Archiv - hier kann nur gelesen werden";
            }
            else if($topic_data[$i]['id'] != $forum_data[$i]['forum_last_post_id'])
            {
                $sql = "SELECT p.topic_id FROM ".POSTS_TABLE." p WHERE p.post_id = ".$forum_data[$i]['forum_last_post_id'];
                if ( !($result = $db->sql_query($sql)) )
                {
                    message_die(GENERAL_ERROR, 'Could not query forums information', '', __LINE__, __FILE__, $sql);
                }
                $row = $db->sql_fetchrow($result);
    
                $sql = "SELECT t.topic_title FROM ".TOPICS_TABLE ." t WHERE t.topic_id = ".$row['topic_id'];
                if ( !($result = $db->sql_query($sql)) )
                {
                    message_die(GENERAL_ERROR, 'Could not query forums information', '', __LINE__, __FILE__, $sql);
                }
                $row = $db->sql_fetchrow($result);
    
                if (count($orig_word))
                    $row['topic_title'] = preg_replace($orig_word, $replacement_word, $row['topic_title']);
    
                $topic_data[$i]['topic_title_full']  = $row['topic_title'];
                $topic_data[$i]['id']                = $forum_data[$i]['forum_last_post_id'];
    
                if (strlen($row['topic_title']) > 43) 
                {
                    $topic_data[$i]['topic_title_short'] = substr($row['topic_title'],0,40) . '...';
                }
                else
                {
                    $topic_data[$i]['topic_title_short'] = $row['topic_title'];
                }
    
            }
    
            $forum_data[$i]['topic_title_full'] = $topic_data[$i]['topic_title_full'];
            $forum_data[$i]['topic_title_short'] = $topic_data[$i]['topic_title_short'];
        }
    }
            gecachter_last_topic_on_index();
    
    /*	
    	//
    	// Filter topic_title not allowed to read
    	// 
    
    	if ( !($userdata['user_level'] == ADMIN && $userdata['session_logged_in']) ) {
    		$auth_read_all = array();
    		$auth_read_all = auth(AUTH_READ, AUTH_LIST_ALL, $userdata, $forum_data);
    		$auth_data = '';
    		for($i=0; $i<count($forum_data); $i++)
    		{
    			if (!$auth_read_all[$forum_data[$i]['forum_id']]['auth_read']) 
    			{
    				$forum_data[$i]['topic_title']='';
    			}
    		}
    	}
    */
    //end of Dimah
    

    und etwas weiter unten

    //Dimah
    //Orginal
    /*
    
    							if ( $forum_data[$j]['forum_last_post_id'] )
    							{
    								$last_post_time = create_date($board_config['default_dateformat'], $forum_data[$j]['post_time'], $board_config['board_timezone']);
    
    								$last_post = $last_post_time . '<br />';
    
    								$last_post .= ( $forum_data[$j]['user_id'] == ANONYMOUS ) ? ( ($forum_data[$j]['post_username'] != '' ) ? $forum_data[$j]['post_username'] . ' ' : $lang['Guest'] . ' ' ) : '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&amp;" . POST_USERS_URL . '='  . $forum_data[$j]['user_id']) . '">' . $forum_data[$j]['username'] . '</a> ';
    
    								$last_post .= '<a href="' . append_sid("viewtopic.$phpEx?"  . POST_POST_URL . '=' . $forum_data[$j]['forum_last_post_id']) . '#' . $forum_data[$j]['forum_last_post_id'] . '"><img src="' . $images['icon_latest_reply'] . '" border="0" alt="' . $lang['View_latest_post'] . '" title="' . $lang['View_latest_post'] . '" /></a>';
    							}
    							else
    							{
    								$last_post = $lang['No_Posts'];
    							}
    */
    //end of Orginal
    
                                         if ($forum_data[$j]['forum_last_post_id'] )
                                         {
                                            $last_post_time = create_date($board_config['default_dateformat'], $forum_data[$j]['post_time'], $board_config['board_timezone']);
    
                                            $last_post = '&nbsp;'.$last_post_time.'<br />&nbsp;<a href="' . append_sid("viewtopic.$phpEx?"  . POST_POST_URL . '=' . $forum_data[$j]['forum_last_post_id']) . '#' . $forum_data[$j]['forum_last_post_id'] . '" title="' . $forum_data[$j]['topic_title_full'] . '">' . $forum_data[$j]['topic_title_short'] . '</a> &nbsp;(';
                                            $last_post .= ( $forum_data[$j]['user_id'] == ANONYMOUS ) ? ( ($forum_data[$j]['post_username'] != '' ) ? $forum_data[$j]['post_username'] . ' ' : $lang['Guest'] . ' ' ) : '<a href="' . append_sid("profile.$phpEx?mode=viewprofile&amp;" . POST_USERS_URL . '='  . $forum_data[$j]['user_id']) . '">' . $forum_data[$j]['username'] . '</a>';
                                            $last_post .= ')&nbsp;&nbsp;';
                                         }
                                         else
                                         {
                                            $last_post = $lang['No_Posts'];
                                         }
    
    //end of Dimah
    

    was kann ich noch optimieren?



  • Peinlich aber wahr, mein code cacht granicht die topic titel.
    da php die static, global varibalen nur solange am leben erhält bis das script durch ist

    der speed gewinn kommt duch den verzicht der JOINS zustannde


Anmelden zum Antworten