ik ben bezig om een website te maken waarop gebruikers hun advertenties kunnen plaatsen.
op dit moment ben ik aan het testen met een behoorlijk aantal advertenties (6100). hierop laat ik een query los die alle advertenties moet ophalen en sorteren.
de volgende (ingekorte) query haalt alle advertenties + koppeling naar categorie en merk op en sorteert op categorie, merk en typenummer:
nu duurt deze query 0,71 seconden volgens mysql, dit vindt ik nogal traag. als ik de orderby weglaat dan duurt de query 0.00-0.01 seconden.
explain select met ORDER BY:
explain select zonder ORDER BY:
het ligt dus aan die filesort, maar hoe zorg ik ervoor dat mysql geen filesort nodig heeft en is dat zoiezo wel mogelijk?
table advertenties
id - primary key, auto inc
typenummer (INDEX) (char 30)
cat_id (FK, INDEX) (int)
merk_id (FK, INDEX) (int)
gebruiker_id (FK, INDEX) (int)
table cat
id - primary key, auto inc
omschrijving (char 50)
table merk
id - primary key, auto inc
omschrijving (char 50)
table gebruiker
id - primary key, auto inc
gebruikersnaam (char 50)
aan de andere kant kan het natuurlijk ook aan de machine liggen, dit is namelijk een p3-500, 384 mb intern geheugen met op dit moment 17mb vrij.
scsi hdd 9gb 10K
draait linux2.4.20, 3 webservers, mysql 4.012.
deze machine wordt in principe alleen gebruikt voor de database en webserver van deze site. er draaien voor de rest geen processor vretende applicaties.
is deze snelheid normaal of heb ik ergens een index niet goed liggen
op dit moment ben ik aan het testen met een behoorlijk aantal advertenties (6100). hierop laat ik een query los die alle advertenties moet ophalen en sorteren.
de volgende (ingekorte) query haalt alle advertenties + koppeling naar categorie en merk op en sorteert op categorie, merk en typenummer:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| SELECT SQL_NO_CACHE DISTINCT cat.omschrijving AS cat, cat.id AS catid, merk.omschrijving AS merk, advertentie.typenummer FROM cat, merk, advertentie, gebruiker WHERE cat.id = advertentie.cat_id AND merk.id = advertentie.merk_id AND advertentie.zichtbaarheid IN (0,1,2,5) AND gebruiker.id = advertentie.gebruiker_id AND gebruiker.accountmode != 2 ORDER BY cat.omschrijving, merk.omschrijving, advertentie.typenummer LIMIT 0, 25 |
nu duurt deze query 0,71 seconden volgens mysql, dit vindt ik nogal traag. als ik de orderby weglaat dan duurt de query 0.00-0.01 seconden.
explain select met ORDER BY:
code:
1
2
3
4
5
6
7
8
| +-------------+--------+-------------------------------------------+--------------+---------+--------------------------+------+----------------------------------------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +-------------+--------+-------------------------------------------+--------------+---------+--------------------------+------+----------------------------------------------+ | merk | index | PRIMARY | omschrijving | 50 | NULL | 101 | Using index; Using temporary; Using filesort | | advertentie | ref | gebruiker_id,merk_id,cat_id,zichtbaarheid | merk_id | 4 | merk.id | 30 | Using where | | cat | eq_ref | PRIMARY | PRIMARY | 4 | advertentie.cat_id | 1 | | | gebruiker | eq_ref | PRIMARY | PRIMARY | 4 | advertentie.gebruiker_id | 1 | Using where; Distinct | +-------------+--------+-------------------------------------------+--------------+---------+--------------------------+------+----------------------------------------------+ |
explain select zonder ORDER BY:
code:
1
2
3
4
5
6
7
8
| +-------------+--------+-------------------------------------------+--------------+---------+--------------------------+------+------------------------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +-------------+--------+-------------------------------------------+--------------+---------+--------------------------+------+------------------------------+ | merk | index | PRIMARY | omschrijving | 50 | NULL | 101 | Using index; Using temporary | | advertentie | ref | gebruiker_id,merk_id,cat_id,zichtbaarheid | merk_id | 4 | merk.id | 30 | Using where | | cat | eq_ref | PRIMARY | PRIMARY | 4 | advertentie.cat_id | 1 | | | gebruiker | eq_ref | PRIMARY | PRIMARY | 4 | advertentie.gebruiker_id | 1 | Using where; Distinct | +-------------+--------+-------------------------------------------+--------------+---------+--------------------------+------+------------------------------+ |
het ligt dus aan die filesort, maar hoe zorg ik ervoor dat mysql geen filesort nodig heeft en is dat zoiezo wel mogelijk?
table advertenties
id - primary key, auto inc
typenummer (INDEX) (char 30)
cat_id (FK, INDEX) (int)
merk_id (FK, INDEX) (int)
gebruiker_id (FK, INDEX) (int)
table cat
id - primary key, auto inc
omschrijving (char 50)
table merk
id - primary key, auto inc
omschrijving (char 50)
table gebruiker
id - primary key, auto inc
gebruikersnaam (char 50)
aan de andere kant kan het natuurlijk ook aan de machine liggen, dit is namelijk een p3-500, 384 mb intern geheugen met op dit moment 17mb vrij.
scsi hdd 9gb 10K
draait linux2.4.20, 3 webservers, mysql 4.012.
deze machine wordt in principe alleen gebruikt voor de database en webserver van deze site. er draaien voor de rest geen processor vretende applicaties.
is deze snelheid normaal of heb ik ergens een index niet goed liggen