Hi,
ik zit op dit moment met een query waarbij ik middels meerdere left joins enkele tabellen aan elkaar knoop en vervolgens nog voorzie van een Group By en een Order
Text tabel en textdetails bevatten +- 800k records
Copy tabel en copydetails bevatten +- 200k records
De andere tabellen zijn een stuk kleiner.
Ik heb foreign keys op iedere kolom waarop ik de left join uit voer. Daarnaast heb ik indexes op de overige kolom die ik in de where statement heb zitten. De query draait echter nog steeds 40 seconden. Als ik de Group By weg laat verbeterd het al iets. Als ik vervolgens de Order weg laat gaat het weer wat sneller.
Ik heb een EXPLAIN uitgevoerd maar die kan ik onvoldoende begrijpen.
Kan iemand mij wat wegwijs maken om een en ander te optimaliseren?
ik zit op dit moment met een query waarbij ik middels meerdere left joins enkele tabellen aan elkaar knoop en vervolgens nog voorzie van een Group By en een Order
Text tabel en textdetails bevatten +- 800k records
Copy tabel en copydetails bevatten +- 200k records
De andere tabellen zijn een stuk kleiner.
Ik heb foreign keys op iedere kolom waarop ik de left join uit voer. Daarnaast heb ik indexes op de overige kolom die ik in de where statement heb zitten. De query draait echter nog steeds 40 seconden. Als ik de Group By weg laat verbeterd het al iets. Als ik vervolgens de Order weg laat gaat het weer wat sneller.
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
| SELECT * FROM `copy` LEFT JOIN `domain` ON domain.domain_id = copy.copy_domain_id LEFT JOIN `domaincategory` ON copy.copy_domain_id = domaincategory.domaincategory_domain_id AND domaincategory.domaincategory_account_id = copy.copy_account_id LEFT JOIN `text` ON text.text_id = copy.copy_text_id LEFT JOIN `textdetails` ON textdetails.textdetails_text_id = text.text_id LEFT JOIN `channel` ON channel.channel_domain_id = domain.domain_id AND channel.channel_account_id = copy.copy_account_id LEFT JOIN `feed` ON feed.feed_id = text.text_feed_id WHERE ( feed.feed_account_id =96 ) AND ( feed.feed_flag_delete IS NULL ) AND ( text.text_flag_delete IS NULL ) AND ( copy.copy_flag_delete IS NULL ) AND ( copy.copy_tracking_date_found IS NOT NULL ) AND ( channel.channel_active =1 ) GROUP BY `copy`.`copy_id` ORDER BY `copy`.`copy_tracking_date_found` DESC LIMIT 50 |
Ik heb een EXPLAIN uitgevoerd maar die kan ik onvoldoende begrijpen.
Kan iemand mij wat wegwijs maken om een en ander te optimaliseren?
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | feed | ref | PRIMARY,fk_feed_account_id,feed_flag_delete | fk_feed_account_id | 4 | const | 1 | Using where; Using temporary; Using filesort |
1 | SIMPLE | text | ref | PRIMARY,fk_text_feed_id,text_flag_delete | text_flag_delete | 2 | const | 2628 | Using where |
1 | SIMPLE | textdetails | ref | fk_textdetails_text_id | fk_textdetails_text_id | 5 | text.text_id | 1 | |
1 | SIMPLE | copy | ref | fk_copy_account_id,fk_copy_domain_id,fk_copy_text_... | fk_copy_text_id | 4 | text.text_id | 2 | Using where |
1 | SIMPLE | domain | eq_ref | PRIMARY | PRIMARY | 4 | copy.copy_domain_id | 1 | Using where |
1 | SIMPLE | domaincategory | ref | fk_domaincategory_account_id,fk_domaincategory_dom... | fk_domaincategory_domain_id | 4 | domain.domain_id | 1 | |
1 | SIMPLE | channel | ref | fk_channel_account_id,fk_channel_domain_id,channel... | fk_channel_domain_id | 4 | copy.copy_domain_id | 2 | Using where |
[ Voor 15% gewijzigd door Verwijderd op 28-10-2015 16:30 ]