Index WP MySQL For Speed

Description

How do I use this plugin?

After you install this plugin, use it with the Index MySQL Tool under the Tools menu. If you have large tables, use it with WP-CLI instead to avoid timeouts. Give the shell command wp help index-mysql to learn how.

What does it do for my site?

This plugin works to make your MySQL database work more efficiently by adding high-performance keys to the tables you choose. On request it monitors your site’s use of your MySQL database to detect which database operations are slowest. It is most useful for large sites: sites with many users, posts, pages, and / or products.

You can use it to restore WordPress’s default keys if need be.

What is this all about?

Where does WordPress store all that stuff that makes your site great? Where are your pages, posts, products, media, users, custom fields, metadata, and all your valuable content? All that data is in the MySQL relational database management system. (Many hosting providers and servers use the MariaDB fork of the MySQL software; it works exactly the same way as MySQL itself.)

As your site grows, your MySQL tables grow. Giant tables can make your page loads slow down, frustrate your users, and even hurt your search-engine rankings. And, bulk imports can take absurd amounts of time. What can you do about this?

You can install and use a database cleaner plugin to get rid of old unwanted data and reorganize your tables. That makes them smaller, and therefore faster. That is a good and necessary task. That is not the task of this plugin. You can, if your hosting provider supports it, install and use a Persistent Object Cache plugin to reduce traffic to your database. That is not the task of this plugin either.

This plugin adds database keys (also called indexes) to your MySQL tables to make it easier for WordPress to find the information it needs. All relational database management systems store your information in long-lived tables. For example, WordPress stores your posts and other content in a table called wp_posts, and custom post fields in another table called wp_postmeta. A successful site can have thousands of posts and hundreds of thousands of custom post fields. MySQL has two jobs:

  1. Keep all that data organized.
  2. Find the data it needs quickly.

To do its second job, MySQL uses database keys. Each table has one or more keys. For example, wp_posts has a key to let it quickly find posts when you know the author. Without its post_author key MySQL would have to scan every one of your posts looking for matches to the author you want. Our users know what that looks like: slow. With the key, MySQL can jump right to the matching posts.

In a new WordPress site with a couple of users and a dozen posts, the keys don’t matter very much. As the site grows the keys start to matter, a lot. Database management systems are designed to have their keys updated, adjusted, and tweaked as their tables grow. They’re designed to allow the keys to evolve without changing the content of the underlying tables. In organizations with large databases adding, dropping, or altering keys doesn’t change the underlying data. It is a routine maintenance task in many data centers. If changing keys caused databases to lose data, the MySQL and MariaDB developers would hear howling not just from you and me, but from many heavyweight users. (You should still back up your WordPress instance of course.)

Better keys allow WordPress’s code to run faster without any code changes. Experience with large sites shows that many MySQL slowdowns can be improved by better keys. Code is poetry, data is treasure, and database keys are grease that makes code and data work together smoothly.

Which tables does the plugin add keys to?

This plugin adds and updates keys in these WordPress tables.

  • wp_comments
  • wp_commentmeta
  • wp_posts
  • wp_postmeta
  • wp_termmeta
  • wp_users
  • wp_usermeta
  • wp_options

You only need run this plugin once to get its benefits.

How can I monitor my database’s operation?

On the Index MySQL page (from your Tools menu on your dashboard), you will find the “Monitor Database Operations” tab. Use it to request monitoring for a number of minutes you choose.

You can monitor

  • either the site (your user-visible pages) or the dashboard, or both.
  • all pageviews, or a random sample. (Random samples are useful on very busy sites to reduce monitoring overhead.)

Once you have gathered monitoring information, you can view the captured queries, and sort them by how long they take. Or you can save the monitor information to a file and show it to somebody who knows about database operations. Or you can upload the monitor to the plugin’s servers so the authors can look at it.

It’s a good idea to monitor for a five-minute interval at a time of day when your site is busy. Once you’ve completed a monitor, you can examine it to determine which database operations are slowing you down the most.

What’s new in version 1.4?

Since the first release, our users have told us about several more opportunities to speed up their WooCommerce and core WordPress operations. We’ve added keys to the meta tables to help with searching for content, and to the users table to look people up by their display names. And, you can now upload saved Monitors so we can see your slowest queries. We’ll use that information to improve future versions. Thanks, dear users!

WordPress version updates attempt to restore some of WordPress’s default keys. This plugin prompts you to add the high-performance keys after updates.

Credits

  • Michael Uno for Admin Page Framework.
  • Marco Cesarato for LiteSQLParser.
  • Allan Jardine for Datatables.net.
  • Japreet Sethi for advice, and for testing on his large installation.
  • Rick James for everything.

Screenshots

  • Use Tools > Index MySQL to view the Dashboard panel.
  • Choose tables and add High-Performance Keys.
  • Start Monitoring Database Operations, and see saved monitors.
  • View a saved monitor to see slow database queries.
  • About the plugin.
  • Use WP CLI to run the plugin's operations.

FAQ

Should I back up my site before using this?

Yes. You already knew that.

I use a nonstandard database table prefix. Will this work ?

Yes. Some WordPress databases have nonstandard prefixes. That is, their tables are named something_posts, something_postmeta, and so forth instead of wp_posts and wp_postmeta. This works with those databases.

My WordPress host offers MariaDB, not MySQL. Can I use this plugin?

Yes.

Which versions of MySQL and MariaDB does this support?

MySQL versions 5.5.62 and above, 5.6.4 and above, 8 and above. MariaDB versions 5.5 and above.

What database Storage Engine does this support?

InnoDB only. If your tables use MyISAM (the older storage engine) or the older COMPACT row format, this plugin offers to upgrade them for you.

What tables and keys does the plugin change?

Please read this.

My site has many users. My Users, Posts, and Pages panels in my dashboard are still slow, even with this plugin.

We have another plugin to handle lots of users, Index WP Users For Speed.

How do I get an answer to another question?

Please see more questions and answers here.

Reviews

اپریل 25, 2022
An absolute game changer! Especially for large databases (in our case millions of rows). And it's open source, which is awesome!
اپریل 5, 2022
All these reviews concerning the outstanding performance of this plugin were enough to convince me and should also be enough to convince everybody else. Great job!
اپریل 1, 2022
I've got a considerable amount of experience with wordpress and woocommerce, but nothing I could do would reveal any improvement in speed without changing the entire stack (moving from apache to nginx, etc). Even with all the caching plugins, the load balanced setup high availability, a cdn, and a database upgrade, it made only minor increments on the website performance. This plugin made the single biggest difference in terms of the speed. I cannot recommend this plugin highly enough.
مارچ 8, 2022
This is by far the best plugin I've ever used -- the code quality is world-class. I'm pretty sure I've tooted your horns before on Reddit, so here I go again. I'm clearly a fan 🙂 Good stuff, dewd!
پروری 19, 2022
I never tend to leave a review, but was compelled this time, first of all, how is this plugin even free? I have used WP Rocket, Redis, and many other plugins to fix my frontend as well as backend but my backend was still laggy, and making any changes from "Quick Edit" will take an eternity, this plugin fixed the issue and my backend is working smoothly so far. Even my frontend is loading faster. Thank you to the devs and request you guys to not let this plugin die.
Read all 24 reviews

Contributors & Developers

“Index WP MySQL For Speed” is open source software. The following people have contributed to this plugin.

Contributors

Changelog

1.4.1

  • WordPress 5.9 and database version 51917 version compatibility tested.
  • Rekeys tables in one go: allows the plugin to work more quickly, and when sql_require_primary_key=ON (typically at managed service providers).
  • Adds high-performance keys to wp_users and wp_commentmeta tables.
  • Adds high-performance keys for filtering on meta_value data quickly in wp_postmeta, wp_termmeta, and wp_usermeta.
  • Handles updates to high-performance keys from previous plugin versions.
  • Checks $wp_db_version number to ensure schema compatibility.
  • Monitor captures include overall database server metrics. Monitor captures can be uploaded.
  • Help pages for each tab of the plugin’s Dashboard panel are available.
  • Clearer Dashboard panel displays.

1.4.2

  • (No changes to keys.)
  • Add support for legacy php versions back to 5.6.
  • Avoid attempting to read INNODB_METRICS when user lacks PROCESS privilege.
  • Correct nag hyperlink on multisite.

1.4.3

  • (No changes to keys.)
  • Detect recent WordPress version update and prompt to restore high-performance keys.

1.4.4

  • (No changes to keys.)
  • Add support for internationalization. Speed up rendering of dashboard panels.
  • In MySQL 5.5, avoid using EXPLAIN on anything except SELECT queries.
  • Don’t remove settings and monitors on deactivate, only on uninstall.