use*_*289 2 php laravel laravel-5
我正在尝试为一个测试数据库设置大量点击次数,以测试我的仪表板指标显示。所以我想生成 25k 个命中,并将它们与Post数据库中的随机数相关联,以便数据保持一致。
我最初试图Post在HitFactory课堂上随机抓取,但这真的非常慢(比如产生几千次点击的几个小时)。然后我将随机部分移到了播种机类中,并且只调用了一次以最小化 DB 命中,认为这会大大加快速度。但它没有 - 创建单个Hit对象仍然需要至少 5-10 秒。
我不确定这怎么可能 - 是否有我遗漏的优化?请注意,我不能只生成 1 - x 之间的随机 int 并将其用作链接Post,因为我正在为posts表使用 UUID 样式 ID 。
这是需要很长时间才能运行的播种机:
use Illuminate\Database\Seeder;
class HitsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$posts = App\Post::all();
$i = 0;
while ($i <= 25000) {
$post = $posts->random();
factory(App\Hit::class)->create(
[
'post_key' => $post->post_key,
'subject_code' => $post->subject_code,
'subject_id' => $post->subject_id,
]
);
$i++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我还尝试在 1-500 之间生成一个随机整数,HitsTableSeeder并将其用作$posts集合的索引以random()完全消除调用。它仍然比我相信的要慢。
while ($i <= 25000) {
$t = rand(0, 500);
$post = $posts[$t];
Run Code Online (Sandbox Code Playgroud)
Kel*_*nan 11
只是张贴这个以防将来它可以帮助任何人。我遇到了类似的问题,插入速度非常慢。如果您使用 MySQL,请尝试使用数据库事务。在您的情况下,在 while 循环之前手动启动事务并在之后提交事务。显然,如果您不手动启动和提交整个组的事务(或块,如果您愿意),MySQL 引擎将单独提交每个插入(增加开销,这对于大型插入来说是明显的)。这样做后,我看到了巨大的性能提升。不仅仅是分块,在我的情况下,这实际上对性能没有帮助。像这样的东西:
use Illuminate\Database\Seeder;
class HitsTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$posts = App\Post::all();
$i = 0;
DB::beginTransaction();
while ($i <= 25000) {
$post = $posts->random();
factory(App\Hit::class)->create(
[
'post_key' => $post->post_key,
'subject_code' => $post->subject_code,
'subject_id' => $post->subject_id,
]
);
}
DB::commit();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:请注意,我实际上还没有在工厂中尝试过,只有常规插入(例如 Model::create() )。希望它有所帮助,但我不是 100% 确定。
| 归档时间: |
|
| 查看次数: |
2105 次 |
| 最近记录: |