php 4 langzaam?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$query = "SELECT
u.referrer,
( SELECT COUNT(id)
FROM referralwedstrijd
WHERE referrer = u.referrer
GROUP BY referrer
) AS aantal_lid,
( SELECT COUNT(id)
FROM referralwedstrijd2
WHERE referrer = u.referrer
GROUP BY referrer
) AS aantal_gestuurd
FROM
referralwedstrijd AS u
GROUP BY
referrer
ORDER BY
aantal_lid DESC,
aantal_gestuurd DESC";
$result = mysql_query($query) or die (mysql_error());
u.referrer,
( SELECT COUNT(id)
FROM referralwedstrijd
WHERE referrer = u.referrer
GROUP BY referrer
) AS aantal_lid,
( SELECT COUNT(id)
FROM referralwedstrijd2
WHERE referrer = u.referrer
GROUP BY referrer
) AS aantal_gestuurd
FROM
referralwedstrijd AS u
GROUP BY
referrer
ORDER BY
aantal_lid DESC,
aantal_gestuurd DESC";
$result = mysql_query($query) or die (mysql_error());
de tabelstructuur:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE `referralwedstrijd` (
`id` int(11) NOT NULL auto_increment,
`userID` varchar(100) NOT NULL default '',
`referrer` varchar(100) NOT NULL default '',
`herkomst` varchar(255) NOT NULL default '',
`datum` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=285 ;
CREATE TABLE `referralwedstrijd2` (
`id` int(11) NOT NULL auto_increment,
`referrer` varchar(100) NOT NULL default '',
`ip` varchar(25) NOT NULL default '',
`herkomst` varchar(255) NOT NULL default '',
`datum` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=18874 ;
`id` int(11) NOT NULL auto_increment,
`userID` varchar(100) NOT NULL default '',
`referrer` varchar(100) NOT NULL default '',
`herkomst` varchar(255) NOT NULL default '',
`datum` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=285 ;
CREATE TABLE `referralwedstrijd2` (
`id` int(11) NOT NULL auto_increment,
`referrer` varchar(100) NOT NULL default '',
`ip` varchar(25) NOT NULL default '',
`herkomst` varchar(255) NOT NULL default '',
`datum` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=18874 ;
Maar daar doet hij welgeteld zo'n 40 seconden over voordat de pagina dan geladen is, ook als ik dit in phpmyadmin doe kom ik op een soortgelijke waarde uit, dus het moet aan de query/database liggen.
Ik zelf zit dus te denken dat mysql 4 (want het is nog geen 5) niet zulke ingewikkelde berekeningen aankan oid?
In de tweede tabel staan weliswaar een kleine 20.000 records, maar dit mag toch niet zoveel problemen opleveren?
Daarnaast heb ik al maanden last van een langzame pagina met een quiz erop.
Ieder gegeven antwoord wordt opgeslagen in een tabel en bij het ophalen van een nieuwe vraag wordt ervoor gezorgd dat deze vraag niets reeds eerder gesteld is a.d.h.v. die gegeven antwoorden tabel.
Ook wordt deze tabel gebruikt voor het bepalen van een maximum aantal te beantwoorden vragen per dag.
In het begin werkte deze pagina soepel en snel, maar momenteel staan er zo'n 170.000 records in, en ik denk dat het steeds zoeken in die records het probleem is.
De query voor het selecteren van een vraag op de quizpagina is:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$query = "SELECT
*
FROM
quizvragen
WHERE
id NOT IN(SELECT vraagID FROM quiz_gegevenantwoorden WHERE username = '".$_SESSION['username']."' AND DATE(tijd) = DATE(NOW()))
ORDER BY
RAND() LIMIT 1";
*
FROM
quizvragen
WHERE
id NOT IN(SELECT vraagID FROM quiz_gegevenantwoorden WHERE username = '".$_SESSION['username']."' AND DATE(tijd) = DATE(NOW()))
ORDER BY
RAND() LIMIT 1";
en voor het bepalen van het maximum aantal te beantwoorden vragen een standaard count query
Code (php)
1
$query = "SELECT COUNT(*) AS aantal FROM quiz_gegevenantwoorden WHERE username = '".$_SESSION['username']."' AND DATE(tijd) = DATE(NOW())";
de tabelstructuur is als volgt:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE TABLE `quizantwoorden` (
`id` int(11) NOT NULL auto_increment,
`vraagID` int(11) NOT NULL default '0',
`antwoord` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=129 ;
CREATE TABLE `quizvragen` (
`id` int(11) NOT NULL auto_increment,
`vraag` varchar(255) NOT NULL default '',
`goedeantwoord` int(11) NOT NULL default '0',
`actief` enum('1','0') NOT NULL default '1',
`ingevoerd` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=33 ;
CREATE TABLE `quiz_gegevenantwoorden` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(100) NOT NULL default '',
`vraagID` int(11) NOT NULL default '0',
`antwoordID` int(11) NOT NULL default '0',
`tijd` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=168404 ;
`id` int(11) NOT NULL auto_increment,
`vraagID` int(11) NOT NULL default '0',
`antwoord` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=129 ;
CREATE TABLE `quizvragen` (
`id` int(11) NOT NULL auto_increment,
`vraag` varchar(255) NOT NULL default '',
`goedeantwoord` int(11) NOT NULL default '0',
`actief` enum('1','0') NOT NULL default '1',
`ingevoerd` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=33 ;
CREATE TABLE `quiz_gegevenantwoorden` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(100) NOT NULL default '',
`vraagID` int(11) NOT NULL default '0',
`antwoordID` int(11) NOT NULL default '0',
`tijd` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=168404 ;
Mijn vraag, heeft Mysql 4 problemen met ingewikkelde query's en/of grote aantallen records?
En zou updaten naar Mysql 5 een oplossing bieden?
Gewijzigd op 01/01/1970 01:00:00 door Stefan van Iwaarden
Bij jou zie ik echter de indexen niet terug? Als je die niet aangebracht hebt op de betreffende kolommen, gaat dat zeker ten koste van de snelheid van je queries. Zorg dus dat je op de juiste plaats deze indexen aanbrengt...
Ik kan prima genormaliseerde databases maken, maar indexes heb ik nog weinig kaas van gegeten.
zie btw mijn startpost, deze heb ik een beetje uitgebreid.
MySQL Indexes
Hierin staat het gebruik van indexes duidelijk uitgelegd. Sowieso als ik naar de ORDER BY in je eerste query kijk, zou ik indexen aanbrengen op aantal_lid en aantal_gestuurd. Maar afhankelijk van andere queries die je veel gebruikt, kan dat zomaar veranderen.
De functie EXPLAIN geeft je overigens veel inzicht in hoe je queries uitgevoerd worden en welke indexen gebruikt worden. Maar dat kun je ook allemaal in die tutorial lezen.
Hierin staat het gebruik van indexes duidelijk uitgelegd. Sowieso als ik naar de ORDER BY in je eerste query kijk, zou ik indexen aanbrengen op aantal_lid en aantal_gestuurd. Maar afhankelijk van andere queries die je veel gebruikt, kan dat zomaar veranderen.
De functie EXPLAIN geeft je overigens veel inzicht in hoe je queries uitgevoerd worden en welke indexen gebruikt worden. Maar dat kun je ook allemaal in die tutorial lezen.
Die indexes maken hét verschil, nu staat het binnen 1 seconde op het scherm, ongelooflijk hoeveel verschil dat maakt, reken maar dat ik dit voortaan ook op toekomstige en eventueel huidige projecten ga toepassen.
Nu nog een oplossing vinden voor dat uploadprobleem.
En indexen, dat maakt wel een factortje tig uit!
Ps. Heeft dus niks met de PHP versie te maken.