Skip to content

An experiment in creating mirrored index subsets for the WordPress meta tables

Notifications You must be signed in to change notification settings

soulseekah/metamirror

Repository files navigation

metamirror

Build Status

An experiment that mirrors subsets of WordPress meta tables for cast-free indexing.

Background

WordPress stores meta information in key-value structures. Post meta, user meta, term meta, comment meta are all tables with a LONGTEXT meta_value that doesn't work well with indexing.

Consider plugins that store numeric values like ratings, pageviews, votecounts. When retrieving objects by these meta values and doing all sorts of math operations on them these values are cast to numeric values (floats or integers). And casting annihilates any indexing there may have been.

Proposed solution

Create shadow meta table(s) that house casted values in with an index on them. Add conditional triggers on the core meta tables that insert/delete/update the values into the mirrors with a cast. Add SQL rewriting for SELECT queries detecting meta keys and "routing" them to the correct mirror table.

Installation

Drop in as a plugin.

Usage

$mirror = new metamirror\Mirror( $wpdb->postmeta, 'INTEGER' );
$mirror->add_meta_key( 'pageviews' );
$mirror->add_meta_key( 'vote%' );
metamirror\Core::add( $mirror );
metamirror\Core::commit();

Do not call Core::commit() every single time! Just like flush_rewrite_rules() it's only meant to be run after adding new mirrors. The mirrors do have to be added either way, but once they're committed, no need to commit again until changes are made. Every commit will DROP all the mirror tables and recreate them.

Warranty

Absolutely none. Don't use in production. Backup before installing or using.

About

An experiment in creating mirrored index subsets for the WordPress meta tables

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published