php 4 langzaam?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Stefan van Iwaarden

Stefan van Iwaarden

27/01/2008 17:33:00
Quote Anchor link
Ik voer op een pagina een query als dit uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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());


de tabelstructuur:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 ;


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)
PHP script in nieuw venster Selecteer het PHP script
1
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";


en voor het bepalen van het maximum aantal te beantwoorden vragen een standaard count query
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
1
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 ;


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
 
PHP hulp

PHP hulp

27/12/2024 00:49:12
 
Joren de Wit

Joren de Wit

27/01/2008 17:38:00
Quote Anchor link
Een aantal van 170.000 records is inderdaad niet schrikbarend veel. Met een correct datamodel en de juiste indexen moet dat geen probleem zijn.

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...
 
Stefan van Iwaarden

Stefan van Iwaarden

27/01/2008 17:41:00
Quote Anchor link
op welke kolommen zou ik dan een index moeten plaatsen?
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.
 
Joren de Wit

Joren de Wit

27/01/2008 17:48:00
Quote Anchor link
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.
 
Stefan van Iwaarden

Stefan van Iwaarden

27/01/2008 18:03:00
Quote Anchor link
Blanche, je bent geweldig, serieus!

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.
 
Frank -

Frank -

28/01/2008 00:46:00
Quote Anchor link
MyISAM.... Er is dus geen sprake van een relationele database, de boel hangt als los zand aan elkaar. Ga minimaal innoDB gebruiken en foreign key's aanmaken, dan krijg je een echte database en geen opgedoft tekstbestand dat je met SQL kunt benaderen... Of je stapt over op een echte database en laat MySQL links liggen.

En indexen, dat maakt wel een factortje tig uit!

Ps. Heeft dus niks met de PHP versie te maken.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.