Performance (MySQL): verschil tussen versies
Naar navigatie springen
Naar zoeken springen
Regel 4: | Regel 4: | ||
* '''Enkelvoudige joins:''' Vervang update-queries met meervoudige joins, door losse meerdere update-queries die elk met enkelvoudige joins werken | * '''Enkelvoudige joins:''' Vervang update-queries met meervoudige joins, door losse meerdere update-queries die elk met enkelvoudige joins werken | ||
* '''Soorten joins:''' Staat me bij dat bv. een ''join'', een ''innner join'' en een ''left/right join'' flinke verschillen qua prestaties. | * '''Soorten joins:''' Staat me bij dat bv. een ''join'', een ''innner join'' en een ''left/right join'' flinke verschillen qua prestaties. | ||
+ | |||
+ | == Casus: Update-query met dubbele join (aug. 2018) == | ||
+ | |||
+ | Deze query eindigde steeds met een time-out na 300 seconde. Zo ver ik kan nagaan, stonden de indexes goed: | ||
+ | |||
+ | <pre> | ||
+ | update description_tmp | ||
+ | |||
+ | join root_tmp on description_tmp.sku = root_tmp.sku_leading | ||
+ | join tool_tmp on root_tmp.tool_id = tool_tmp.tool_id | ||
+ | |||
+ | set en_part_02_application_special = | ||
+ | concat | ||
+ | ( | ||
+ | " for ", | ||
+ | root_tmp.tool_brand, " ", | ||
+ | tool_tmp.kind_en, " ", # Hiervoor heb je de dubbbele join | ||
+ | root_tmp.tool_type, " " | ||
+ | ); | ||
+ | </pre> | ||
+ | |||
+ | Echter, opgeslitst in twee enkelvoudige update-queries, doet-ie er maar zes seconde over: | ||
+ | |||
+ | <pre> | ||
+ | # Use to update-queries with a single join each, in stead of one | ||
+ | # update-query with a double join: Huge difference in execution time | ||
+ | # | ||
+ | # First update-query: root_tmp | ||
+ | ################################## | ||
+ | # | ||
+ | # | ||
+ | alter table root_tmp add column kind_en varchar(45) null; | ||
+ | |||
+ | update root_tmp | ||
+ | join tool_tmp on root_tmp.tool_id = tool_tmp.tool_id | ||
+ | set root_tmp.kind_en = tool_tmp.kind_en; | ||
+ | |||
+ | |||
+ | # Second update-query | ||
+ | ################################## | ||
+ | # | ||
+ | call add_column_unless_exists("description_tmp","en_part_02_application_special","varchar(100)"); | ||
+ | |||
+ | update description_tmp | ||
+ | join root_tmp on description_tmp.sku = root_tmp.sku_leading | ||
+ | set en_part_02_application_special = | ||
+ | concat | ||
+ | ( | ||
+ | " for ", | ||
+ | root_tmp.tool_brand, " ", | ||
+ | root_tmp.kind_en, " ", | ||
+ | root_tmp.tool_type | ||
+ | ); | ||
+ | </pre> | ||
== Zie ook == | == Zie ook == | ||
* [[Indexes (MySQL)]] | * [[Indexes (MySQL)]] |
Versie van 29 aug 2018 16:33
MySQL langzamer dan je verwacht had?
- Indexes - Ik heb dankzij indexes de tijdsduur van queries van minuten, kunnen reduceren tot secondes. Gewoon alle velden die in joins voorkomen, voorzien van een index → Indexes (MySQL)
- Enkelvoudige joins: Vervang update-queries met meervoudige joins, door losse meerdere update-queries die elk met enkelvoudige joins werken
- Soorten joins: Staat me bij dat bv. een join, een innner join en een left/right join flinke verschillen qua prestaties.
Casus: Update-query met dubbele join (aug. 2018)
Deze query eindigde steeds met een time-out na 300 seconde. Zo ver ik kan nagaan, stonden de indexes goed:
update description_tmp join root_tmp on description_tmp.sku = root_tmp.sku_leading join tool_tmp on root_tmp.tool_id = tool_tmp.tool_id set en_part_02_application_special = concat ( " for ", root_tmp.tool_brand, " ", tool_tmp.kind_en, " ", # Hiervoor heb je de dubbbele join root_tmp.tool_type, " " );
Echter, opgeslitst in twee enkelvoudige update-queries, doet-ie er maar zes seconde over:
# Use to update-queries with a single join each, in stead of one # update-query with a double join: Huge difference in execution time # # First update-query: root_tmp ################################## # # alter table root_tmp add column kind_en varchar(45) null; update root_tmp join tool_tmp on root_tmp.tool_id = tool_tmp.tool_id set root_tmp.kind_en = tool_tmp.kind_en; # Second update-query ################################## # call add_column_unless_exists("description_tmp","en_part_02_application_special","varchar(100)"); update description_tmp join root_tmp on description_tmp.sku = root_tmp.sku_leading set en_part_02_application_special = concat ( " for ", root_tmp.tool_brand, " ", root_tmp.kind_en, " ", root_tmp.tool_type );