[sql] weleche typen/attribute soll ich benutzen und welche checksumm-alog



  • also ich habe eine tabelle in der ergebnisse gecacht werden,
    sie besteht aus

    • checksumme (id)
    • ein zeitangabe wann das letze mal jemand auf den datensatz zurück gegriffen wurde
    • das ergebniss das gecacht werden soll

    das ganze hat den sinn das ich eine funktion habe die cpp-quellcode bunt einfärbt (mit html), nennen wir sie mal cpp_syntax_coloring()
    diese funktion wird jedesmal aufgerufen wenn jemand ein quellcode ankuckt, da sich aber viele leute den gleichen quellcode ankucken ist es natürlich so das diese funktion für immer wieder die gleiche arbeit mit den gleichen cpp-code macht, da wäre ich doch dumm wenn ich das nicht cachen würde

    deswegen habe ich so ein cache gebaut

    $code = 'int main() { return 0; }';
    
    $crc = crc32($code);
    
    $code_with_syntax_highlight = get_from_cache($crc);
    
    if($code_with_syntax_highlight == FAlSE)
    {
        $code_with_syntax_highlight = cpp_syntax_coloring($code);
    
        insert_to_cache($crc, $code_with_syntax_highlight);
    }
    
    function get_from_cache($id)
    {
        global $db;
        $sql = "SELECT code FROM code_cache WHERE id = '".addslashes($id)."'";
    
        if ($result = $db->sql_query($sql))
        {
            if ($row = $db->sql_fetchrow($result))
            {
                $sql = "UPDATE code_cache SET last_time_used = '".time()."' WHERE id = '".addslashes($id)."'";
                $db->sql_query($sql);
    
                return $row['code'];
            }
        }
        return FALSE;
    }
    
    function insert_to_cache($id, $code)
    {
        global $db;
        $sql = "INSERT INTO code_cache VALUES ('".addslashes($id)."', '".time()."', '".addslashes($code)."')";
        if (!($result = $db->sql_query($sql)))
        {
            message_die(GENERAL_ERROR, 'Could not insert code data in code_cache', '', __LINE__, __FILE__, $sql);
        }
        // hier müsste noch hin das der datensatz mit den ältes datum gelöscht wird
    }
    

    jetzt frage ich mich welches die besten typen und attribute in einer mysql db sind für so eine tabelle, hauptaugen merk liegt
    auf "SELECT code FROM code_cache WHERE id = '".addslashes($id)."'"

    punkt zwei, der checksummen-algo, welcher von den ist schnell aber noch eingermassen eindeutig?



  • Entweder md5 oder die ID des Beitrags inklusive einer fortlaufender Nummer des C++ Codes in dem Beitrag (darf man eben nicht mehr als 9 mal C++ Codes in einem Beitrag benutzen).



  • Loggy schrieb:

    Entweder md5 oder die ID des Beitrags inklusive einer fortlaufender Nummer des C++ Codes in dem Beitrag (darf man eben nicht mehr als 9 mal C++ Codes in einem Beitrag benutzen).

    hmm dachte das speed nicht zu den stärken von md5 gehört, aber das mit der topic id habe ich mir auch schon überlegt



  • Dimah schrieb:

    das mit der topic id habe ich mir auch schon überlegt

    nur musste ich dafür den code ändern und viel speed bringt das auch nicht

    ps. ob md5 oder crc32 macht bei meinen speed tests kein unterschied



  • ok die attribute habe ich jetzt so gewählt

    CREATE TABLE `code_cache` (
      `id` int(11) NOT NULL default '0',
      `last_time_used` int(11) NOT NULL default '0',
      `code` mediumtext NOT NULL,
      PRIMARY KEY  (`id`)
    ) TYPE=MyISAM;
    

    jetzt bin ich auf der suche nach einen sql query das mit die zeile mit den altesten datum löscht, habe ich an sowas gedacht

    "DELETE FROM code_cache WHERE last_time_used = (SELECT MIN(last_time_used) FROM code_cache)"
    

    aber das funktioniert nicht, entweder ist unser db zu alt oder ich habe irgend wo ein fehler



  • DELETE FROM code_cache ORDER BY last_time_used ASC LIMIT 1



  • will auch nicht, wahrscheinlich leigt das an mysql 3.x



  • MySQL-Dokumentation schrieb:

    If an ORDER BY clause is used (available from MySQL 4.0.0), the rows will be deleted in that order. This is really only useful in conjunction with LIMIT.

    Du wirst also wohl nicht drumrumkommen, erst ein SELECT zu machen um den Eintrag zu ermitteln und mit dem ermittelten Wert ein DELETE zu machen (also 2 Queries)


Anmelden zum Antworten