Oke, om te beginnen een klein beetje context bij de query: Bij het tonen van een lijst met nog-te-pakken-artikelen (looplijst in magazijn) wordt getoond of deze klant het product al eens heeft geretourneerd.
Na klachten van de klant over traagheid bij het laden van de looplijst en wat uitzoekwerk blijkt deze feature de boosdoener te zijn.
Wat ik heb is een SELECT met een subquery die het aantal ophaalt van de laatste retour van dit artikel:
Deze query duurt met het pakken van 100 artikelen al gauw 30 seconden.
Als ik:
De indexes staan volgens allemaal goed ingesteld (ik kan als dat nodig is de table structure posten).
Dus mijn vraag; hoe kan een select-value invloed hebben op de performance van de query en hoe los ik dat op?
De EXPLAIN van de query:
Na klachten van de klant over traagheid bij het laden van de looplijst en wat uitzoekwerk blijkt deze feature de boosdoener te zijn.
Wat ik heb is een SELECT met een subquery die het aantal ophaalt van de laatste retour van dit artikel:
MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
| SELECT n.*, ( SELECT ar.amount FROM clientorder co INNER JOIN clientorderitem coi ON coi.clientorder_id = co.clientorder_id INNER JOIN clientpackageitem cpi ON cpi.clientorderitem_id = coi.clientorderitem_id INNER JOIN articleretour ar ON ar.clientpackageitem_id = cpi.clientpackageitem_id WHERE co.account_id = n.account_id AND coi.artnr = n.artnr ORDER BY co.placed DESC LIMIT 1 ) AS 'retourcount' FROM needed_articles n WHERE n.account_id = 2812 |
Deze query duurt met het pakken van 100 artikelen al gauw 30 seconden.
Als ik:
code:
vervang door 1
| SELECT ar.amount FROM clientorder co |
code:
dan is hij super snel( < 0,05 sec)1
| SELECT COUNT(*) FROM clientorder co |
De indexes staan volgens allemaal goed ingesteld (ik kan als dat nodig is de table structure posten).
Dus mijn vraag; hoe kan een select-value invloed hebben op de performance van de query en hoe los ik dat op?
De EXPLAIN van de query:
+----+--------------------+--------+-------+----------------------------------------------------------------------------------------------+----------------------------------------------------+---------+----------------------------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+--------+-------+----------------------------------------------------------------------------------------------+----------------------------------------------------+---------+----------------------------+------+--------------------------+ | 1 | PRIMARY | n | ref | account_id_clientorder_id_clientorderitem_id_artnr,fk-dm_nodig-account_id | account_id_clientorder_id_clientorderitem_id_artnr | 2 | const | 15 | | | 2 | DEPENDENT SUBQUERY | co | index | PRIMARY,fk-dm_clientorder-account_id,account_id_placed,account_id_clientordertype_id_placed | ix-dm_clientorder-placed | 9 | | 1 | Using where | | 2 | DEPENDENT SUBQUERY | coi | ref | PRIMARY,un-dm_clientorderitem-clientorder_id-artnr | un-dm_clientorderitem-clientorder_id-artnr | 7 | co.clientorder_id, n.artnr | 1 | Using index | | 2 | DEPENDENT SUBQUERY | cpi | ref | PRIMARY,fk-dm_clientpackageitem-clientorderitem_id | fk-dm_clientpackageitem-clientorderitem_id | 4 | coi.clientorderitem_id | 1 | Using index | | 2 | DEPENDENT SUBQUERY | ar | ref | clientpackageitem_id_articleretourreason_id,clientpackageitem_id | clientpackageitem_id | 9 | cpi.clientpackageitem_id | 1 | Using where; Using index | +----+--------------------+--------+-------+----------------------------------------------------------------------------------------------+----------------------------------------------------+---------+----------------------------+------+--------------------------+