Ik heb een database in MySQL waarin ik de logs van bepaalde IRC servers, en IRC channels in opsla. Ik heb een tabel structuur die ziet er (versimpeld) zo uit:
Op zich geen probleem, totdat ik een query wil draaien om de omliggende regels van een bepaalde rowid op te vragen, ik doe dat als volgt:
Het resultaat hiervan is een query die bijna 9 seconde loopt:
10 rows in set (8.51 sec).
Op dat moment, geeft de EXPLAIN hiervan dit als uitkomst:
en dan hou je (door de "using filesort") dus geen performance meer over als je database een klein beetje groot is. Het rare is, dat hij wel de juiste index lijkt te gebruiken.
Heeft iemand nog een idee over hoe dit snel te krijgen? Ik ben een klein beetje door de ideeen heen.
Updateje:
Ik heb voor degene die het graag eens willen testten een dump gemaakt van een test(!) database. Hier kan je een bzip2 file downloaden met een dump erin. Deze file is 17 megabyte groot. Normaal gesproken is de database grootte ongeveer 10 keer zo groot, omdat er dus ook de daadwerkelijke chat logs in zitten. Het aantal rows komt wel aardig overeen.
MySQL:
1
2
3
4
5
6
7
| CREATE TABLE ircdata ( id int(10) unsigned NOT NULL auto_increment, ChannelNumber int(11) NOT NULL default '0', idinverted int(10) unsigned NOT NULL default '0', PRIMARY KEY (id), KEY idx_chan_idinverted (ChannelNumber,idinverted,id), ) TYPE=InnoDB; |
Op zich geen probleem, totdat ik een query wil draaien om de omliggende regels van een bepaalde rowid op te vragen, ik doe dat als volgt:
SQL:
1
2
3
4
| SELECT * FROM ircdata WHERE (ChannelNumber = 0) AND (idinverted > 2312213) ORDER BY id DESC LIMIT 10; |
Het resultaat hiervan is een query die bijna 9 seconde loopt:
10 rows in set (8.51 sec).
Op dat moment, geeft de EXPLAIN hiervan dit als uitkomst:
code:
1
2
3
4
5
6
7
8
9
10
11
12
| +---------+-------+---------------------+---------------------+ | table | type | possible_keys | key | +---------+-------+---------------------+---------------------+ | ircdata | range | idx_chan_idinverted | idx_chan_idinverted | +---------+-------+---------------------+---------------------+ +---------+------+---------+------------------------------------------+ | key_len | ref | rows | Extra | +---------+------+---------+------------------------------------------+ | 8 | NULL | 3721956 | Using where; Using index; Using filesort | |---------+------+---------+------------------------------------------+ |
en dan hou je (door de "using filesort") dus geen performance meer over als je database een klein beetje groot is. Het rare is, dat hij wel de juiste index lijkt te gebruiken.
Heeft iemand nog een idee over hoe dit snel te krijgen? Ik ben een klein beetje door de ideeen heen.
Updateje:
Ik heb voor degene die het graag eens willen testten een dump gemaakt van een test(!) database. Hier kan je een bzip2 file downloaden met een dump erin. Deze file is 17 megabyte groot. Normaal gesproken is de database grootte ongeveer 10 keer zo groot, omdat er dus ook de daadwerkelijke chat logs in zitten. Het aantal rows komt wel aardig overeen.
[ Voor 25% gewijzigd door elevator op 17-08-2003 17:29 ]