Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Settings: Prime options to reduce database queries #13700

Merged
merged 17 commits into from
May 23, 2024

Conversation

Swanand01
Copy link
Collaborator

@Swanand01 Swanand01 commented May 22, 2024

Summary

This PR adds the use of wp_prime_option_caches_by_group to combine queries for web-stories related options on the dashboard.

User-facing changes

None.

Testing Instructions

This PR can be tested by following these steps:

  1. Download the Query Monitor plugin.
  2. Observe the Database queries on the Web Stories plugin dashboard.
image

Reviews

Does this PR have a security-related impact?

No.

Does this PR change what data or activity we track or use?

No.

Does this PR have a legal-related impact?

No.

Checklist

  • This PR addresses an existing issue and I have linked this PR to it
  • I have tested this code to the best of my abilities
  • I have verified accessibility to the best of my abilities (docs)
  • I have verified i18n and l10n (translation, right-to-left layout) to the best of my abilities
  • This code is covered by automated tests (unit, integration, and/or e2e) to verify it works as intended (docs)
  • I have added documentation where necessary
  • I have added a matching Type: XYZ label to the PR

Fixes #13523

Copy link
Contributor

github-actions bot commented May 22, 2024

Size Change: 0 B

Total Size: 2.77 MB

ℹ️ View Unchanged
Filename Size
assets/css/web-stories-block-rtl.css 4.65 kB
assets/css/web-stories-block.css 4.68 kB
assets/css/web-stories-carousel-rtl.css 711 B
assets/css/web-stories-carousel.css 712 B
assets/css/web-stories-dashboard-rtl.css 656 B
assets/css/web-stories-dashboard.css 658 B
assets/css/web-stories-editor-rtl.css 769 B
assets/css/web-stories-editor.css 771 B
assets/css/web-stories-embed-rtl.css 664 B
assets/css/web-stories-embed.css 667 B
assets/css/web-stories-list-styles-rtl.css 2.43 kB
assets/css/web-stories-list-styles.css 2.46 kB
assets/css/web-stories-theme-style-twentyeleven-rtl.css 102 B
assets/css/web-stories-theme-style-twentyeleven.css 102 B
assets/css/web-stories-theme-style-twentyfifteen-rtl.css 251 B
assets/css/web-stories-theme-style-twentyfifteen.css 251 B
assets/css/web-stories-theme-style-twentyfourteen-rtl.css 287 B
assets/css/web-stories-theme-style-twentyfourteen.css 287 B
assets/css/web-stories-theme-style-twentyseventeen-rtl.css 310 B
assets/css/web-stories-theme-style-twentyseventeen.css 310 B
assets/css/web-stories-theme-style-twentysixteen-rtl.css 239 B
assets/css/web-stories-theme-style-twentysixteen.css 239 B
assets/css/web-stories-theme-style-twentyten-rtl.css 143 B
assets/css/web-stories-theme-style-twentyten.css 143 B
assets/css/web-stories-theme-style-twentytwelve-rtl.css 265 B
assets/css/web-stories-theme-style-twentytwelve.css 265 B
assets/css/web-stories-theme-style-twentytwenty-rtl.css 86 B
assets/css/web-stories-theme-style-twentytwenty.css 86 B
assets/css/web-stories-theme-style-twentytwentyone-rtl.css 326 B
assets/css/web-stories-theme-style-twentytwentyone.css 326 B
assets/css/web-stories-widget-rtl.css 456 B
assets/css/web-stories-widget.css 456 B
assets/js/3768.js 13.9 kB
assets/js/3933.js 27.2 kB
assets/js/4032.js 4.74 kB
assets/js/4810.js 218 kB
assets/js/5380.js 8.12 kB
assets/js/7830.js 38.1 kB
assets/js/9391.js 93 B
assets/js/945.js 49.1 kB
assets/js/9947.js 97.3 kB
assets/js/chunk-colorthief.js 2.62 kB
assets/js/chunk-ffmpeg.js 5.98 kB
assets/js/chunk-html-to-image.js 4.51 kB
assets/js/chunk-media-gallery.js 6.11 kB
assets/js/chunk-mediainfo.js 94 B
assets/js/chunk-opentype.js 96 B
assets/js/chunk-react-calendar.js 10.8 kB
assets/js/chunk-react-color.js 25.7 kB
assets/js/chunk-selfie-segmentation.js 16.3 kB
assets/js/chunk-web-stories-template-0-metaData.js 546 B
assets/js/chunk-web-stories-template-0.js 11 kB
assets/js/chunk-web-stories-template-1-metaData.js 538 B
assets/js/chunk-web-stories-template-1.js 9.27 kB
assets/js/chunk-web-stories-template-10-metaData.js 532 B
assets/js/chunk-web-stories-template-10.js 7.23 kB
assets/js/chunk-web-stories-template-11-metaData.js 539 B
assets/js/chunk-web-stories-template-11.js 8.87 kB
assets/js/chunk-web-stories-template-12-metaData.js 496 B
assets/js/chunk-web-stories-template-12.js 8.67 kB
assets/js/chunk-web-stories-template-13-metaData.js 524 B
assets/js/chunk-web-stories-template-13.js 6.9 kB
assets/js/chunk-web-stories-template-14-metaData.js 582 B
assets/js/chunk-web-stories-template-14.js 7.26 kB
assets/js/chunk-web-stories-template-15-metaData.js 545 B
assets/js/chunk-web-stories-template-15.js 8.78 kB
assets/js/chunk-web-stories-template-16-metaData.js 588 B
assets/js/chunk-web-stories-template-16.js 10.5 kB
assets/js/chunk-web-stories-template-17-metaData.js 540 B
assets/js/chunk-web-stories-template-17.js 9.05 kB
assets/js/chunk-web-stories-template-18-metaData.js 586 B
assets/js/chunk-web-stories-template-18.js 9.31 kB
assets/js/chunk-web-stories-template-19-metaData.js 499 B
assets/js/chunk-web-stories-template-19.js 9.17 kB
assets/js/chunk-web-stories-template-2-metaData.js 587 B
assets/js/chunk-web-stories-template-2.js 9.02 kB
assets/js/chunk-web-stories-template-20-metaData.js 547 B
assets/js/chunk-web-stories-template-20.js 8.72 kB
assets/js/chunk-web-stories-template-21-metaData.js 536 B
assets/js/chunk-web-stories-template-21.js 9.49 kB
assets/js/chunk-web-stories-template-22-metaData.js 526 B
assets/js/chunk-web-stories-template-22.js 7.44 kB
assets/js/chunk-web-stories-template-23-metaData.js 605 B
assets/js/chunk-web-stories-template-23.js 6.95 kB
assets/js/chunk-web-stories-template-24-metaData.js 517 B
assets/js/chunk-web-stories-template-24.js 11.2 kB
assets/js/chunk-web-stories-template-25-metaData.js 544 B
assets/js/chunk-web-stories-template-25.js 6.8 kB
assets/js/chunk-web-stories-template-26-metaData.js 600 B
assets/js/chunk-web-stories-template-26.js 6.97 kB
assets/js/chunk-web-stories-template-27-metaData.js 543 B
assets/js/chunk-web-stories-template-27.js 7.66 kB
assets/js/chunk-web-stories-template-28-metaData.js 532 B
assets/js/chunk-web-stories-template-28.js 8.76 kB
assets/js/chunk-web-stories-template-29-metaData.js 563 B
assets/js/chunk-web-stories-template-29.js 8.94 kB
assets/js/chunk-web-stories-template-3-metaData.js 537 B
assets/js/chunk-web-stories-template-3.js 8.23 kB
assets/js/chunk-web-stories-template-30-metaData.js 575 B
assets/js/chunk-web-stories-template-30.js 7.43 kB
assets/js/chunk-web-stories-template-31-metaData.js 504 B
assets/js/chunk-web-stories-template-31.js 9.93 kB
assets/js/chunk-web-stories-template-32-metaData.js 551 B
assets/js/chunk-web-stories-template-32.js 12.3 kB
assets/js/chunk-web-stories-template-33-metaData.js 492 B
assets/js/chunk-web-stories-template-33.js 8.9 kB
assets/js/chunk-web-stories-template-34-metaData.js 570 B
assets/js/chunk-web-stories-template-34.js 7.43 kB
assets/js/chunk-web-stories-template-35-metaData.js 565 B
assets/js/chunk-web-stories-template-35.js 8.7 kB
assets/js/chunk-web-stories-template-36-metaData.js 576 B
assets/js/chunk-web-stories-template-36.js 12.1 kB
assets/js/chunk-web-stories-template-37-metaData.js 529 B
assets/js/chunk-web-stories-template-37.js 6.13 kB
assets/js/chunk-web-stories-template-38-metaData.js 572 B
assets/js/chunk-web-stories-template-38.js 7.63 kB
assets/js/chunk-web-stories-template-39-metaData.js 588 B
assets/js/chunk-web-stories-template-39.js 7.79 kB
assets/js/chunk-web-stories-template-4-metaData.js 564 B
assets/js/chunk-web-stories-template-4.js 11.8 kB
assets/js/chunk-web-stories-template-40-metaData.js 557 B
assets/js/chunk-web-stories-template-40.js 9.85 kB
assets/js/chunk-web-stories-template-41-metaData.js 572 B
assets/js/chunk-web-stories-template-41.js 7.45 kB
assets/js/chunk-web-stories-template-42-metaData.js 522 B
assets/js/chunk-web-stories-template-42.js 6.82 kB
assets/js/chunk-web-stories-template-43-metaData.js 558 B
assets/js/chunk-web-stories-template-43.js 8.49 kB
assets/js/chunk-web-stories-template-44-metaData.js 583 B
assets/js/chunk-web-stories-template-44.js 10.8 kB
assets/js/chunk-web-stories-template-45-metaData.js 563 B
assets/js/chunk-web-stories-template-45.js 7.15 kB
assets/js/chunk-web-stories-template-46-metaData.js 531 B
assets/js/chunk-web-stories-template-46.js 5.1 kB
assets/js/chunk-web-stories-template-47-metaData.js 592 B
assets/js/chunk-web-stories-template-47.js 8.97 kB
assets/js/chunk-web-stories-template-48-metaData.js 555 B
assets/js/chunk-web-stories-template-48.js 8.78 kB
assets/js/chunk-web-stories-template-49-metaData.js 517 B
assets/js/chunk-web-stories-template-49.js 8.58 kB
assets/js/chunk-web-stories-template-5-metaData.js 555 B
assets/js/chunk-web-stories-template-5.js 9.54 kB
assets/js/chunk-web-stories-template-50-metaData.js 503 B
assets/js/chunk-web-stories-template-50.js 8.93 kB
assets/js/chunk-web-stories-template-51-metaData.js 527 B
assets/js/chunk-web-stories-template-51.js 10.1 kB
assets/js/chunk-web-stories-template-52-metaData.js 603 B
assets/js/chunk-web-stories-template-52.js 9.97 kB
assets/js/chunk-web-stories-template-53-metaData.js 552 B
assets/js/chunk-web-stories-template-53.js 5.65 kB
assets/js/chunk-web-stories-template-54-metaData.js 547 B
assets/js/chunk-web-stories-template-54.js 7.46 kB
assets/js/chunk-web-stories-template-55-metaData.js 574 B
assets/js/chunk-web-stories-template-55.js 6.95 kB
assets/js/chunk-web-stories-template-56-metaData.js 542 B
assets/js/chunk-web-stories-template-56.js 9.54 kB
assets/js/chunk-web-stories-template-57-metaData.js 527 B
assets/js/chunk-web-stories-template-57.js 14.5 kB
assets/js/chunk-web-stories-template-58-metaData.js 552 B
assets/js/chunk-web-stories-template-58.js 5.43 kB
assets/js/chunk-web-stories-template-59-metaData.js 589 B
assets/js/chunk-web-stories-template-59.js 8.73 kB
assets/js/chunk-web-stories-template-6-metaData.js 570 B
assets/js/chunk-web-stories-template-6.js 6.93 kB
assets/js/chunk-web-stories-template-60-metaData.js 511 B
assets/js/chunk-web-stories-template-60.js 8.95 kB
assets/js/chunk-web-stories-template-7-metaData.js 569 B
assets/js/chunk-web-stories-template-7.js 7.15 kB
assets/js/chunk-web-stories-template-8-metaData.js 568 B
assets/js/chunk-web-stories-template-8.js 8.34 kB
assets/js/chunk-web-stories-template-9-metaData.js 579 B
assets/js/chunk-web-stories-template-9.js 8.24 kB
assets/js/chunk-web-stories-templates.js 581 B
assets/js/chunk-web-stories-textset-0.js 4.59 kB
assets/js/chunk-web-stories-textset-1.js 5.61 kB
assets/js/chunk-web-stories-textset-2.js 6.83 kB
assets/js/chunk-web-stories-textset-3.js 12.8 kB
assets/js/chunk-web-stories-textset-4.js 3.91 kB
assets/js/chunk-web-stories-textset-5.js 5.27 kB
assets/js/chunk-web-stories-textset-6.js 4.99 kB
assets/js/chunk-web-stories-textset-7.js 8.9 kB
assets/js/generateBlurhash.worker.worker.js 1.1 kB
assets/js/web-stories-activation-notice.js 22.5 kB
assets/js/web-stories-block.js 27.5 kB
assets/js/web-stories-carousel.js 9.88 kB
assets/js/web-stories-dashboard.js 63.2 kB
assets/js/web-stories-editor.js 1.46 MB
assets/js/web-stories-embed.js 20 B
assets/js/web-stories-lightbox.js 7.31 kB
assets/js/web-stories-tinymce-button.js 9.72 kB
assets/js/web-stories-widget.js 553 B

compressed-size-action

@googleforcreators-bot
Copy link
Collaborator

googleforcreators-bot commented May 22, 2024

Plugin builds for 1080062 are ready 🛎️!

includes/Settings.php Outdated Show resolved Hide resolved
@swissspidy swissspidy changed the title Feat: Improve options usage Settings: Prime options to reduce database queries May 22, 2024
@swissspidy
Copy link
Collaborator

While reviewing this I noticed a few other places where we could optimize our database queries. Granted, this PR here makes such optimizations a bit redundant, as now they will all be primed.

Thinking out loud, here's what I found:


This call here causes a database query on every page load:

$active_publisher_logo_id = absint( $this->settings->get_setting( $this->settings::SETTING_NAME_ACTIVE_PUBLISHER_LOGO, 0 ) );

Removing this call would require all sorts of changes to other classes depending on this default value. So probably not worth it.


This call also causes a db query on every page load:

} elseif ( 'site-kit' === $handler && $this->is_analytics_module_active() ) {

This is not something that the priming can address, as it's not our own option we're loading here.

We can probably refactor to something like this:

add_filter(
	'googlesitekit_analytics-4_tag_amp_blocked',
	function ( $blocked ) {
		$handler = $this->settings->get_setting( $this->settings::SETTING_NAME_TRACKING_HANDLER );

		if ( 'web-stories' === $handler && $this->context->is_web_story() ) {
			return true;
		}

		return $blocked;
	}
);
add_action(
	'web_stories_print_analytics',
	function () {
		$handler = $this->settings->get_setting( $this->settings::SETTING_NAME_TRACKING_HANDLER );
		if ( 'site-kit' === $handler && $this->is_analytics_module_active() ) {
			remove_action( 'web_stories_print_analytics', [ $this->analytics, 'print_analytics_tag' ] );
		}
	},
	5
);

Another database query caused by this on every admin page:

$settings = $this->get_dashboard_settings();

which calls get_setting and get_plugin_status() methods, which call the db.

Potential solution: maybe split up get_dashboard_settings() method into two or so.


On my local site I also noticed that a lot of options are autoloaded that probably shouldn't.

Some countermeasures to consider:

  • Use wp_set_option_autoload_values in a new database migration
  • Update \Google\Web_Stories\Settings::update_setting() to support a third optional $autoload parameter. Then, explicitly pass this in places where we update options. Not sure I like that one though.

@swissspidy
Copy link
Collaborator

OK that was quite the rabbit hole I went down here 😅

I found quite a few services that were being registered too early, causing unnecessary database queries. Also, some queries happened even before the priming happened.

The web_stories_customizer_settings is now also registered so that it belongs to the same settings group that is primed at the beginning.

Now there are indeed only the 2 expected database queries from the priming.

@swissspidy swissspidy added Type: Enhancement New feature or improvement of an existing feature Type: Performance Performance related issues and enhancements. labels May 23, 2024
@swissspidy swissspidy added this to the 1.37.0 milestone May 23, 2024
@swissspidy swissspidy merged commit 852bdf6 into main May 23, 2024
26 checks passed
@swissspidy swissspidy deleted the feat/improve-options-usage branch May 23, 2024 13:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Type: Enhancement New feature or improvement of an existing feature Type: Performance Performance related issues and enhancements.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Improve options usage
3 participants