Ik heb een probleem met een query die erg traag wordt omdat hij een index niet gebruikt. Ik heb me al uitgebreid ingelezen in indices etc, ook heb ik al een vergelijkbaar topic gevonden (Mysql Traag door order by Desc), maar toch kom ik er nog niet uit 
De query bevat wat joins, where-clausules en een ORDER BY DESC, maar als ik die allemaal verwijder blijf ik tegen (in mijn ogen) iets vreemds aanlopen.
Dit levert de volgende EXPLAIN op:
Er bestaan indices op id (PRIMARY) en gtin (INDEX).
Deze worden hier niet gebruikt, ondanks de ORDER BY id. Ook bij een SELECT * worden deze niet gebruikt.
Als ik echter niet de gtin maar id SELECT, wordt de index wél gebruikt:
of
Als ik een index op op (id,gtin) aanmaak en de eerste query weer draai wordt deze nieuwe index wél gebruikt.
Naar mijn weten wordt een index gebruikt om de juiste records op te zoeken in de tabel (op basis van de WHERE clausules) en de records te sorteren waar mogelijk (op basis van de ORDER BY clausules), maar niet om de inhoud van gevraagde kolommen op te halen binnen de geselecteerde records?
Mijn vraag: waarom is het nodig om het SELECT-veld in de index op te nemen, voordat deze gebruikt kan worden?
De query bevat wat joins, where-clausules en een ORDER BY DESC, maar als ik die allemaal verwijder blijf ik tegen (in mijn ogen) iets vreemds aanlopen.
code:
1
| SELECT gtin FROM articles ORDER BY id |
Dit levert de volgende EXPLAIN op:
code:
1
2
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 1 | SIMPLE | articles | ALL | NULL | NULL | NULL | NULL | 585339 | Using filesort |
Er bestaan indices op id (PRIMARY) en gtin (INDEX).
Deze worden hier niet gebruikt, ondanks de ORDER BY id. Ook bij een SELECT * worden deze niet gebruikt.
Als ik echter niet de gtin maar id SELECT, wordt de index wél gebruikt:
code:
1
| SELECT id FROM articles ORDER BY id |
code:
1
2
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 1 | SIMPLE | articles | index | NULL | PRIMARY | 3 | NULL | 585339 | Using index |
of
code:
1
| SELECT gtin FROM articles ORDER BY gtin |
code:
1
2
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 1 | SIMPLE | articles | index | NULL | gtin | 768 | NULL | 585339 | Using index |
Als ik een index op op (id,gtin) aanmaak en de eerste query weer draai wordt deze nieuwe index wél gebruikt.
code:
1
2
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 1 | SIMPLE | articles | index | NULL | id_gtin | 771 | NULL | 585339 | Using index |
Naar mijn weten wordt een index gebruikt om de juiste records op te zoeken in de tabel (op basis van de WHERE clausules) en de records te sorteren waar mogelijk (op basis van de ORDER BY clausules), maar niet om de inhoud van gevraagde kolommen op te halen binnen de geselecteerde records?
Mijn vraag: waarom is het nodig om het SELECT-veld in de index op te nemen, voordat deze gebruikt kan worden?
Designer | Developer | Director | Photographer | LARPer | Geek | Male | 39