Simplify flushing group contact cache query to reduce table locking and improve performance #17846
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Overview
This attempts to improve performance of
civicrm_group_contact_cache
flushes and reduce the likelihood of deadlocks because of locked tables.Before
We don't build a list of expired groups before running DELETE queries and JOIN
civicrm_group_contact_cache
withcivicrm_group
during the DELETE operation to determine which entries to delete.After
We build a list of expired groups using a non-blocking SELECT query. Then we use a DELETE on
civicrm_group_contact_cache
without a JOIN reducing the chance of hitting a deadlock because we are only locking a single table. Then we UPDATE thecivicrm_group
cache times in a separate query based on the previously built list of groups.Technical Details
Explained above
Comments
@eileenmcnaughton @colemanw @seamuslee001