Voor een intern ledensysteem wordt alles wat een gebruiker doet in die applicatie opgeslagen in een logboektabel in MySQL
Deze tabel heeft de volgende vorm
Deze tabel staat min of meer vast en bevat momenteel een kleine 5000 records. Niks spectaculairs dus. De indexen staat zodanig gezien er enkel op gebruiker/id wordt gesorteerd of gefilterd (één of ander).
De betreffende database draait slechts één applicatie (PHP-based), de server wordt dus nauwelijks belast (testomgeving, één gebruiker). Het herstarten van het MySQL proces verbetert niets.
Nu duurt het invoegen van een nieuwe rij in deze database met enige regelmaat ontzettend lang, denk aan 1,5 tot 6 seconden. Volgens de profiler van PHP (xDebug) komt dit volledig door één functie: doLog welke een rij invoegt in de databse (niet meer, niet minder). Op dezelfde pagina worden er een kleine 500 selects gedaan met data die vrijwel niet gewijzigd wordt. De gebruikte functie aanroep voor de SQL opdracht is $mysqli->query(query). De query ziet er bijvoorbeeld zo uit
Hierin is $strMelding een melding vanuit het systeem (string, geen userinput). USER_ID is bekend, getClientIp() geeft het IP adres terug.
Hoe kan het dat zo'n simpele insert zo lang duurt, terwijl de queries naar de db voor de selects wel razendsnel zijn?
P.S. Met enige regelmaat is een van de 500 selects ook wat traag (terwijl uit dezelfde tabel data ophalen), maar dat is max tot 0.08 seconden
Deze tabel heeft de volgende vorm
code:
1
2
3
4
5
6
7
8
9
| CREATE TABLE `tbl_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `gebruiker` int(11) NOT NULL, `ip` varchar(15) NOT NULL, `tijd` datetime NOT NULL, `wat` text NOT NULL, PRIMARY KEY (`id`), KEY `gebruiker` (`gebruiker`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
Deze tabel staat min of meer vast en bevat momenteel een kleine 5000 records. Niks spectaculairs dus. De indexen staat zodanig gezien er enkel op gebruiker/id wordt gesorteerd of gefilterd (één of ander).
De betreffende database draait slechts één applicatie (PHP-based), de server wordt dus nauwelijks belast (testomgeving, één gebruiker). Het herstarten van het MySQL proces verbetert niets.
Nu duurt het invoegen van een nieuwe rij in deze database met enige regelmaat ontzettend lang, denk aan 1,5 tot 6 seconden. Volgens de profiler van PHP (xDebug) komt dit volledig door één functie: doLog welke een rij invoegt in de databse (niet meer, niet minder). Op dezelfde pagina worden er een kleine 500 selects gedaan met data die vrijwel niet gewijzigd wordt. De gebruikte functie aanroep voor de SQL opdracht is $mysqli->query(query). De query ziet er bijvoorbeeld zo uit
code:
1
| $strInsertLog = "INSERT INTO tbl_log (gebruiker,ip,tijd,wat) VALUES (" . intval(USER_ID) . ",'" . GetClientIP() . "',NOW(),'" . $strMelding . "')"; |
Hierin is $strMelding een melding vanuit het systeem (string, geen userinput). USER_ID is bekend, getClientIp() geeft het IP adres terug.
Hoe kan het dat zo'n simpele insert zo lang duurt, terwijl de queries naar de db voor de selects wel razendsnel zijn?
P.S. Met enige regelmaat is een van de 500 selects ook wat traag (terwijl uit dezelfde tabel data ophalen), maar dat is max tot 0.08 seconden