Fix old indices not being removed in schema migration leading to slow MySQL queries (#86917)
fixes #83787pull/86932/head
parent
b82ecfdd28
commit
4e9bd09d39
|
@ -55,7 +55,7 @@ from .models import StatisticData, StatisticMetaData, process_timestamp
|
||||||
# pylint: disable=invalid-name
|
# pylint: disable=invalid-name
|
||||||
Base = declarative_base()
|
Base = declarative_base()
|
||||||
|
|
||||||
SCHEMA_VERSION = 32
|
SCHEMA_VERSION = 33
|
||||||
|
|
||||||
_StatisticsBaseSelfT = TypeVar("_StatisticsBaseSelfT", bound="StatisticsBase")
|
_StatisticsBaseSelfT = TypeVar("_StatisticsBaseSelfT", bound="StatisticsBase")
|
||||||
|
|
||||||
|
|
|
@ -505,12 +505,12 @@ def _apply_update( # noqa: C901
|
||||||
timestamp_type = "FLOAT"
|
timestamp_type = "FLOAT"
|
||||||
|
|
||||||
if new_version == 1:
|
if new_version == 1:
|
||||||
_create_index(session_maker, "events", "ix_events_time_fired")
|
# This used to create ix_events_time_fired, but it was removed in version 32
|
||||||
|
pass
|
||||||
elif new_version == 2:
|
elif new_version == 2:
|
||||||
# Create compound start/end index for recorder_runs
|
# Create compound start/end index for recorder_runs
|
||||||
_create_index(session_maker, "recorder_runs", "ix_recorder_runs_start_end")
|
_create_index(session_maker, "recorder_runs", "ix_recorder_runs_start_end")
|
||||||
# Create indexes for states
|
# This used to create ix_states_last_updated bit it was removed in version 32
|
||||||
_create_index(session_maker, "states", "ix_states_last_updated")
|
|
||||||
elif new_version == 3:
|
elif new_version == 3:
|
||||||
# There used to be a new index here, but it was removed in version 4.
|
# There used to be a new index here, but it was removed in version 4.
|
||||||
pass
|
pass
|
||||||
|
@ -529,8 +529,7 @@ def _apply_update( # noqa: C901
|
||||||
_drop_index(session_maker, "states", "states__state_changes")
|
_drop_index(session_maker, "states", "states__state_changes")
|
||||||
_drop_index(session_maker, "states", "states__significant_changes")
|
_drop_index(session_maker, "states", "states__significant_changes")
|
||||||
_drop_index(session_maker, "states", "ix_states_entity_id_created")
|
_drop_index(session_maker, "states", "ix_states_entity_id_created")
|
||||||
|
# This used to create ix_states_entity_id_last_updated, but it was removed in version 32
|
||||||
_create_index(session_maker, "states", "ix_states_entity_id_last_updated")
|
|
||||||
elif new_version == 5:
|
elif new_version == 5:
|
||||||
# Create supporting index for States.event_id foreign key
|
# Create supporting index for States.event_id foreign key
|
||||||
_create_index(session_maker, "states", "ix_states_event_id")
|
_create_index(session_maker, "states", "ix_states_event_id")
|
||||||
|
@ -541,20 +540,21 @@ def _apply_update( # noqa: C901
|
||||||
["context_id CHARACTER(36)", "context_user_id CHARACTER(36)"],
|
["context_id CHARACTER(36)", "context_user_id CHARACTER(36)"],
|
||||||
)
|
)
|
||||||
_create_index(session_maker, "events", "ix_events_context_id")
|
_create_index(session_maker, "events", "ix_events_context_id")
|
||||||
_create_index(session_maker, "events", "ix_events_context_user_id")
|
# This used to create ix_events_context_user_id, but it was removed in version 28
|
||||||
_add_columns(
|
_add_columns(
|
||||||
session_maker,
|
session_maker,
|
||||||
"states",
|
"states",
|
||||||
["context_id CHARACTER(36)", "context_user_id CHARACTER(36)"],
|
["context_id CHARACTER(36)", "context_user_id CHARACTER(36)"],
|
||||||
)
|
)
|
||||||
_create_index(session_maker, "states", "ix_states_context_id")
|
_create_index(session_maker, "states", "ix_states_context_id")
|
||||||
_create_index(session_maker, "states", "ix_states_context_user_id")
|
# This used to create ix_states_context_user_id, but it was removed in version 28
|
||||||
elif new_version == 7:
|
elif new_version == 7:
|
||||||
_create_index(session_maker, "states", "ix_states_entity_id")
|
# There used to be a ix_states_entity_id index here, but it was removed in later schema
|
||||||
|
pass
|
||||||
elif new_version == 8:
|
elif new_version == 8:
|
||||||
_add_columns(session_maker, "events", ["context_parent_id CHARACTER(36)"])
|
_add_columns(session_maker, "events", ["context_parent_id CHARACTER(36)"])
|
||||||
_add_columns(session_maker, "states", ["old_state_id INTEGER"])
|
_add_columns(session_maker, "states", ["old_state_id INTEGER"])
|
||||||
_create_index(session_maker, "events", "ix_events_context_parent_id")
|
# This used to create ix_events_context_parent_id, but it was removed in version 28
|
||||||
elif new_version == 9:
|
elif new_version == 9:
|
||||||
# We now get the context from events with a join
|
# We now get the context from events with a join
|
||||||
# since its always there on state_changed events
|
# since its always there on state_changed events
|
||||||
|
@ -572,7 +572,7 @@ def _apply_update( # noqa: C901
|
||||||
# Redundant keys on composite index:
|
# Redundant keys on composite index:
|
||||||
# We already have ix_states_entity_id_last_updated
|
# We already have ix_states_entity_id_last_updated
|
||||||
_drop_index(session_maker, "states", "ix_states_entity_id")
|
_drop_index(session_maker, "states", "ix_states_entity_id")
|
||||||
_create_index(session_maker, "events", "ix_events_event_type_time_fired")
|
# This used to create ix_events_event_type_time_fired, but it was removed in version 32
|
||||||
_drop_index(session_maker, "events", "ix_events_event_type")
|
_drop_index(session_maker, "events", "ix_events_event_type")
|
||||||
elif new_version == 10:
|
elif new_version == 10:
|
||||||
# Now done in step 11
|
# Now done in step 11
|
||||||
|
@ -859,6 +859,11 @@ def _apply_update( # noqa: C901
|
||||||
_drop_index(session_maker, "events", "ix_events_event_type_time_fired")
|
_drop_index(session_maker, "events", "ix_events_event_type_time_fired")
|
||||||
_drop_index(session_maker, "states", "ix_states_last_updated")
|
_drop_index(session_maker, "states", "ix_states_last_updated")
|
||||||
_drop_index(session_maker, "events", "ix_events_time_fired")
|
_drop_index(session_maker, "events", "ix_events_time_fired")
|
||||||
|
elif new_version == 33:
|
||||||
|
# This index is no longer used and can cause MySQL to use the wrong index
|
||||||
|
# when querying the states table.
|
||||||
|
# https://github.com/home-assistant/core/issues/83787
|
||||||
|
_drop_index(session_maker, "states", "ix_states_entity_id")
|
||||||
else:
|
else:
|
||||||
raise ValueError(f"No schema migration defined for version {new_version}")
|
raise ValueError(f"No schema migration defined for version {new_version}")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue