利用原生swoole协程批量向数据库插入1000W条数据

2023-03-22 17:23:11 浏览数 (2)

一直再听说高并发,没有体验过真正的高并发,这次体验下1000w数据表(不知道算不算大数据),刚好体验下mysql索引的性能; 这次带大家体验下上千万的表并发查询操作,本例用的是swoole协程,插入1000W条数据(引用官方demo); 固态硬盘大概30分钟左右,机械硬盘可自行测试,可修改for循环中的个数控制插入条数;

代码语言:javascript复制
<?php
/**
 * @author ChenDasheng
 * @created 2020/9/13 1:47
 */
declare(strict_types=1);

use SwooleCoroutine;
use SwooleDatabasePDOConfig;
use SwooleDatabasePDOPool;
use SwooleRuntime;

// 线程数
const N = 1024;

Runtime::enableCoroutine();
// 记录时间
$s = microtime(true);
// 开启容器
Coroutinerun(function () {
//mysql 连接池 因为是教程 就没有去检测在连接中特殊情况
    $pool = new PDOPool((new PDOConfig)
        ->withHost('127.0.0.1')
        ->withPort(3306)
        ->withDbName('demo')
        ->withCharset('utf8mb4')
        ->withUsername('root')
        ->withPassword('123456')
    );
//循环写入数据库
    for ($n = 1024; $n--;) {
        Coroutine::create(function () use ($pool) {
            $pdo = $pool->get();
            for ($i = 10000; $i--;) {
                $statement = $pdo->prepare('INSERT INTO customers1 (`name`,`city`,`gender`,`birthdate`,`mobile`,`photo`,`monthsalary`,`yearbonus`) value (?,?,?,?,?,?,?,?)');
                if (!$statement) {
                    throw new RuntimeException('Prepare failed');
                }
                $a = mt_rand(1, 10);
                $b = mt_rand(1, 100);
                $result = $statement->execute([getChar(mt_rand(2, 4)), getChar(mt_rand(2, 4)), $a, date('Y-m-d', mt_rand(strtotime('2020-01-01'), strtotime('2021-01-01'))),   '155'.mt_rand(10000000,99999999), $a, $a, $b]);
                if (!$result) {
                    throw new RuntimeException('Execute failed');
                }
            }
            $pool->put($pdo);
        });
    }
});


$s = microtime(true) - $s;
echo 'Use ' . $s . 's for ' . N . ' queries' . PHP_EOL;

/**
 * 自动生成汉字
 * @param $num 为生成汉字的数量
 * @return string
 * @author ChenDasheng
 * @created 2020/9/24 20:36
 */
function getChar($num)
{
    $b = '';
    for ($i = 0; $i < $num; $i  ) {
        // 使用chr()函数拼接双字节汉字,前一个chr()为高位字节,后一个为低位字节
        $a = chr(mt_rand(0xB0, 0xD0)) . chr(mt_rand(0xA1, 0xF0));
        // 转码
        $b .= iconv('GB2312', 'UTF-8', $a);
    }
    return $b;
}

0 人点赞