优化京东账单首次汇总与候选查询的覆盖索引
This commit is contained in:
parent
d735de7864
commit
8e4bf99483
@ -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'));
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user