Ik ben een applicatie aan het bouwen voor het beheren van ruilkaartcollecties. Bij het weergeven van kaarten kunnen gebruikers filters toepassen om de resultaten te verfijnen.
Het probleem is echter dat deze filtercriteria telkens een nieuwe join toevoegen aan de query, waardoor ik met +- 25 joins zit. Bij grotere resultaten (5000) is dit nefast voor de performance en duurt het uitvoeren van de query tot één seconde, wat veel te traag is.
Aangezien de WHERE clausule dynamisch opgebouwd wordt en weinig relevantie heeft, heb ik ze weggelaten binnen dit voorbeeld (alsook paginering):
Hoe kan ik de uitvoertijd verbeteren zonder mijn database schema overhoop te halen?
Het probleem is echter dat deze filtercriteria telkens een nieuwe join toevoegen aan de query, waardoor ik met +- 25 joins zit. Bij grotere resultaten (5000) is dit nefast voor de performance en duurt het uitvoeren van de query tot één seconde, wat veel te traag is.
Aangezien de WHERE clausule dynamisch opgebouwd wordt en weinig relevantie heeft, heb ik ze weggelaten binnen dit voorbeeld (alsook paginering):
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
| SELECT card_variant.id AS card_id, card.name AS card_name, GROUP_CONCAT( DISTINCT card_type.name ORDER BY card_type.name ASC SEPARATOR \', \' ) AS card_types, GROUP_CONCAT( DISTINCT card_variant_type.name ORDER BY card_variant_type.name ASC SEPARATOR \', \' ) AS card_variant_types, expansion.name AS expansion_name, expansion.symbol_file_path AS expansion_symbol_file_path, card.number, card_rarity.name AS rarity_name, language_has_card_rarity.symbol_file_path AS rarity_symbol_file_path, card_variant.image_file_path FROM card INNER JOIN card_variant ON card.id = card_variant.card_id INNER JOIN card_variant_has_card_variant_type ON card_variant.id = card_variant_has_card_variant_type.card_variant_id INNER JOIN card_variant_type ON card_variant_has_card_variant_type.card_variant_type_id = card_variant_type.id INNER JOIN expansion ON card.expansion_id = expansion.id INNER JOIN expansion_series ON expansion.expansion_series_id = expansion_series.id INNER JOIN language ON expansion_series.language_id = language.id LEFT JOIN card_has_card_type ON card.id = card_has_card_type.card_id LEFT JOIN card_type ON card_has_card_type.card_type_id = card_type.id LEFT JOIN card_has_energy_type on card.id = card_has_energy_type.card_id LEFT JOIN energy_type ON card_has_energy_type.energy_type_id = energy_type.id LEFT JOIN pokemon_stage ON card.pokemon_stage_id = pokemon_stage.id LEFT JOIN card_effect ON card.id = card_effect.card_id LEFT JOIN card_attack ON card.id = card_attack.card_id LEFT JOIN card_attack_has_energy_type ON card_attack.id = card_attack_has_energy_type.card_attack_id LEFT JOIN energy_type AS attack_energy_type ON card_attack_has_energy_type.energy_type_id = attack_energy_type.id LEFT JOIN card_has_weakness ON card.id = card_has_weakness.card_id LEFT JOIN energy_type AS weakness ON card_has_weakness.energy_type_id = weakness.id LEFT JOIN card_has_resistance ON card.id = card_has_resistance.card_id LEFT JOIN energy_type AS resistance ON card_has_resistance.energy_type_id = resistance.id INNER JOIN card_rarity ON card.card_rarity_id = card_rarity.id INNER JOIN language_has_card_rarity ON card_rarity.id = language_has_card_rarity.card_rarity_id LEFT JOIN card_has_card_illustrator ON card.id = card_has_card_illustrator.card_id LEFT JOIN card_illustrator ON card_has_card_illustrator.card_illustrator_id = card_illustrator.id GROUP BY card_variant.id; |
Hoe kan ik de uitvoertijd verbeteren zonder mijn database schema overhoop te halen?