GoogleForCreators / web-stories-wp

Web Stories for WordPress
https://wp.stories.google
Apache License 2.0
758 stars 179 forks source link

Settings: Prime options to reduce database queries #13700

Closed Swanand01 closed 1 month ago

Swanand01 commented 1 month ago

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


Fixes #13523

github-actions[bot] commented 1 month ago

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 commented 1 month ago

Plugin builds for 1080062d68722b80b2894dcfc6646ada2c6bc9bd are ready :bellhop_bell:!

swissspidy commented 1 month ago

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:

https://github.com/GoogleForCreators/web-stories-wp/blob/0f96e44b4ed953adff43c9d4b39d744a696b4766/includes/Story_Post_Type.php#L133

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:

https://github.com/GoogleForCreators/web-stories-wp/blob/0f96e44b4ed953adff43c9d4b39d744a696b4766/includes/Integrations/Site_Kit.php#L110

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:

https://github.com/GoogleForCreators/web-stories-wp/blob/0f96e44b4ed953adff43c9d4b39d744a696b4766/includes/Admin/Dashboard.php#L240

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:

swissspidy commented 1 month ago

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.