perf(2meet-data-optimizer): let the status/date copy route stop at the LIMIT

- Copy route: drop WordPress's GROUP BY when the flat row is the only join,
  and read posts.ID tie-breaks as the flat post_id (own direction, once)
- Post status sync: index (post_status, post_date, post_id) replaces the
  two-column idx_post_status_date (added / dropped by post-status-sync)
- dev36, 235k of 1.3M listings in a price range: main query 1.7 s -> 3 ms
- Verify: composer test (704), test:integration (597), phpcs, stan
- PR: PR-128
This commit is contained in:
2026-09-27 23:12:34 +08:00
parent 2aa9058ee9
commit 8ee3dce0fe
4 changed files with 141 additions and 15 deletions
+27 -2
View File
@@ -82,9 +82,34 @@ class PostStatusSyncTest extends TestCase {
return $out;
}
private function has_index( string $table ): bool {
/** @return array<string, string[]> index name → columns */
private function indexes( string $table ): array {
global $wpdb;
return in_array( 'idx_post_status_date', array_column( (array) $wpdb->get_results( "SHOW INDEX FROM `{$table}`", ARRAY_A ), 'Key_name' ), true );
$out = array();
foreach ( (array) $wpdb->get_results( "SHOW INDEX FROM `{$table}`", ARRAY_A ) as $row ) {
$out[ $row['Key_name'] ][ (int) $row['Seq_in_index'] - 1 ] = $row['Column_name'];
}
return $out;
}
private function has_index( string $table ): bool {
return array( 'post_status', 'post_date', 'post_id' ) === ( $this->indexes( $table )['idx_post_status_date_id'] ?? null );
}
/**
* 2.4 PR-128: the date route's ID tie-break is read from post_id, which the
* index must end with; the 2.2 two-column index is replaced, not kept beside it.
*/
public function test_run_replaces_the_two_column_index_of_existing_tables(): void {
global $wpdb;
$wpdb->query( 'ALTER TABLE `' . self::A . '` ADD COLUMN post_status VARCHAR(20) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL, ADD COLUMN post_date DATETIME DEFAULT NULL, ADD INDEX idx_post_status_date (post_status, post_date)' );
$GLOBALS['_wp_options'][ TMDO_Post_Status_Sync::OPTION ] = array( 'ps_a' => 'ready' );
TMDO_Post_Status_Sync::run();
$this->assertTrue( $this->has_index( self::A ) );
$this->assertArrayNotHasKey( 'idx_post_status_date', $this->indexes( self::A ) );
$this->assertSame( 'ready', TMDO_Post_Status_Sync::state( 'ps_a' ) );
}
public function test_run_adds_the_columns_copies_every_row_and_marks_groups_ready(): void {