Zie ook order by optimaliseren in MYSQL
In de search kom ik ook niet veel tergen wat mij een antwoord geeft.
Mijn vraag beste geillustreerd met wat sql outpout
Het mag duidelijk zijn dat ik de filesort wil voorkomen. Wat ik niet snap is dat MYSQL de ene keer gewoon de index (order by subject) gebruikt en de andere keer niet (order by contenttype of msgid).
Filesort gaat erg langzaam bij 800000 records terwijl ik er toch minstens tussen de 10 en 20 miljoen records wil hebben.
Hoe komt dit en hoe kan ik het voorkomen?
(Graag niet mijn hoofd breken over select *, dat is puur ter illustratie)
In de search kom ik ook niet veel tergen wat mij een antwoord geeft.
Mijn vraag beste geillustreerd met wat sql outpout
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| mysql> show index from headers; +---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+---------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Comment | +---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+---------+ | headers | 0 | PRIMARY | 1 | hid | A | 751618 | NULL | NULL | | | headers | 1 | subject | 1 | subject | A | 751618 | NULL | NULL | | | headers | 1 | subject | 2 | msgid | A | 751618 | NULL | NULL | | | headers | 1 | subject | 3 | groupid | A | 751618 | NULL | NULL | | | headers | 1 | subject | 4 | date | A | 751618 | NULL | NULL | | | headers | 1 | contenttype | 1 | contenttype | A | 479 | NULL | NULL | | | headers | 1 | newssort | 1 | groupid | A | 13 | NULL | NULL | | | headers | 1 | newssort | 2 | subject | A | 751618 | NULL | NULL | | | headers | 1 | newssort | 3 | date | A | 751618 | NULL | NULL | | | headers | 1 | newssort | 4 | contenttype | A | 751618 | NULL | NULL | | | headers | 1 | date | 1 | date | A | 375809 | NULL | NULL | | +---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+---------+ 11 rows in set (0.01 sec) mysql> explain select * from headers where groupid='52184' order by subject limit 10; +---------+-------+---------------+----------+---------+------+--------+------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +---------+-------+---------------+----------+---------+------+--------+------------+ | headers | range | newssort | newssort | 3 | NULL | 751618 | where used | +---------+-------+---------------+----------+---------+------+--------+------------+ 1 row in set (0.00 sec) mysql> explain select * from headers where groupid='52184' order by msgid limit 10; +---------+-------+---------------+----------+---------+------+--------+----------------------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +---------+-------+---------------+----------+---------+------+--------+----------------------------+ | headers | range | newssort | newssort | 3 | NULL | 751618 | where used; Using filesort | +---------+-------+---------------+----------+---------+------+--------+----------------------------+ 1 row in set (0.00 sec) mysql> explain select * from headers where groupid='52184' order by contenttype limit 10; +---------+-------+---------------+----------+---------+------+--------+----------------------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +---------+-------+---------------+----------+---------+------+--------+----------------------------+ | headers | range | newssort | newssort | 3 | NULL | 751618 | where used; Using filesort | +---------+-------+---------------+----------+---------+------+--------+----------------------------+ 1 row in set (0.01 sec) |
Het mag duidelijk zijn dat ik de filesort wil voorkomen. Wat ik niet snap is dat MYSQL de ene keer gewoon de index (order by subject) gebruikt en de andere keer niet (order by contenttype of msgid).
Filesort gaat erg langzaam bij 800000 records terwijl ik er toch minstens tussen de 10 en 20 miljoen records wil hebben.
Hoe komt dit en hoe kan ik het voorkomen?
(Graag niet mijn hoofd breken over select *, dat is puur ter illustratie)