优化京东账单首次汇总与候选查询的覆盖索引

This commit is contained in:
WuYongJie 2026-10-19 18:14:37 +08:00
parent d735de7864
commit 8e4bf99483
2 changed files with 42 additions and 0 deletions

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
if (config('system_database.mode', 'bootstrap') === 'bootstrap') return;
$schema = Schema::connection((string) config('upstream_mirrors.connection', 'business_mirror'));
if (! $schema->hasTable('jd_daily_bill_rows')) return;
if (collect($schema->getIndexes('jd_daily_bill_rows'))->contains('name', 'jd_daily_summary_cover')) return;
$columns = ['generation', 'occurred_at', 'income', 'expense', 'store_name', 'bill_item'];
$connection = $schema->getConnection();
if ($connection->getDriverName() === 'mysql') {
// Platform scope reads store_name: without it SUM must fetch every wide JSON row.
$wait = (int) $connection->selectOne('SELECT @@SESSION.lock_wait_timeout AS seconds')->seconds;
$connection->statement('SET SESSION lock_wait_timeout=5');
try {
$table = $connection->getQueryGrammar()->wrapTable('jd_daily_bill_rows');
$connection->statement('ALTER TABLE ' . $table . ' ADD INDEX jd_daily_summary_cover (generation, occurred_at, income, expense, store_name, bill_item), ALGORITHM=INPLACE, LOCK=NONE');
} finally {
$connection->statement('SET SESSION lock_wait_timeout=' . $wait);
}
} else {
$schema->table('jd_daily_bill_rows', fn (Blueprint $table) => $table->index($columns, 'jd_daily_summary_cover'));
}
}
public function down(): void
{
if (config('system_database.mode', 'bootstrap') === 'bootstrap') return;
$schema = Schema::connection((string) config('upstream_mirrors.connection', 'business_mirror'));
if ($schema->hasTable('jd_daily_bill_rows') && collect($schema->getIndexes('jd_daily_bill_rows'))->contains('name', 'jd_daily_summary_cover')) {
$schema->table('jd_daily_bill_rows', fn (Blueprint $table) => $table->dropIndex('jd_daily_summary_cover'));
}
}
};

View File

@ -20,6 +20,8 @@ class JdDailyBillTest extends TestCase
config(['database.connections.business_mirror' => ['driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '']]);
DB::purge('business_mirror');
(require database_path('migrations/2026_09_18_140000_create_jd_daily_bill_mirror_tables.php'))->up();
config(['system_database.mode' => 'shared']);
(require database_path('migrations/2026_10_19_181000_cover_jd_daily_bill_summary_filters.php'))->up();
}
protected function tearDown(): void