來,看看MySQL插入速度能有50W每秒嗎
寫入速度
- MySQL每秒可以插入50w條記錄嗎?
- 帶著疑問,我們一起看看mysql每秒可以插入多少條記錄?
- 要回答這個問題,首先要考慮影響mysql插入速度的因素有哪些?
硬盤的速度,網(wǎng)卡的速度,寫入行的數(shù)據(jù)量,數(shù)據(jù)在硬盤中的存放位置等等因素。
簡單的數(shù)據(jù),插入速度肯定快,復(fù)雜的插入肯定慢。
所以單純這個問題不好回答,最好的辦法是進行壓力測試,最后求一個平均值。
一 測試環(huán)境:
MySQL表結(jié)構(gòu)
- CREATE TABLE `user_10w` (
- `id` int(10) NOT NULL AUTO_INCREMENT,
- `name` varchar(20) DEFAULT NULL,
- `mobile` varchar(11) DEFAULT NULL,
- `add_time` int(11) DEFAULT NULL,
- `groupid` tinyint(1) DEFAULT NULL,
- `login_time` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM AUTO_INCREMENT=4730016 DEFAULT CHARSET=utf8mb4
電腦配置
4核 Intel(R) Core(TM) i3-8100 CPU @ 3.60GHz
ssd 120G硬盤
二. 開始測試
說明:單機測試,不涉及網(wǎng)卡,網(wǎng)絡(luò)傳輸?shù)挠绊?/p>
測試程序php pdo
- include_once("tool.php");
- $dsn = 'mysql:dbname=demo;host=127.0.0.1';
- $user = 'root';
- $pass = 'root';
- try{
- $hand = new PDO($dsn, $user, $pass);
- }catch(PDOException $e){
- echo 'Connection failed: ' . $e->getMessage();
- }
- $query = $hand->prepare("insert into user_10w(name,mobile,add_time,groupid,last_login_time) values(?,?,?,?,?)");
- $n=0;
- $count = 1000000; //每次插入100w
- $t = time();
- echo 'start write,time is '. $t. "\n";
- while(true){
- $n++;
- $name = Tool::getRandomStr(5);
- $mobile = Tool::getRandNum(9);
- $group = Tool::getRandNum(1);
- $rs = $query->execute([$name,'13'.$mobile,time(),$group,time()]);
- if($n>$count)break;
- }
- echo 'write end, time is '. (time()-$t) . "\n";
1.無任何索引,單進程
- start write,time is 1593338798
- write end, time is 50
耗時50s, 平均2w/秒
2. 給name添加普通索引
- write end, time is 60
- root@test:/data/php# php7 pdo.php
- start write,time is 1593393695
- write end, time is 61
大概慢了10s ,所以索引會導(dǎo)致插入變慢,因為要更新索引

負載
3. 多進程測試
用go寫了一個簡單的多進程執(zhí)行程序
- package main
- import(
- "os/exec"
- "sync"
- )
- var wg sync.WaitGroup
- func testRun(wg *sync.WaitGroup){
- c := exec.Command("php7", "./pdo.php")
- c.Run()
- wg.Done()
- }
- func main(){
- var n int = 10
- wg.Add(n)
- for i:=0;i<n;i++{
- go testRun(&wg)
- }
- wg.Wait();
- }

4進程負載
結(jié)果:
耗時115s ,插入速度平均3.4w/s
MySQL鎖表狀態(tài)

mysql status
10進程一起執(zhí)行

10進程
耗時5‘10“ ,插入速度大概3.2w/s
MySQL鎖表狀態(tài)

MySQL status
最后:
- 可見,插入速度并沒有網(wǎng)上說的那么高,隨著進程數(shù)增多,鎖沖突逐漸增加,插入效率下降。
- 通過存儲過程批量進行插入 ,插入速度應(yīng)該會更高,但在實際高并發(fā)應(yīng)用中使用并不多!
- 拋開業(yè)務(wù),單純測這個好像沒什么意義,一定要結(jié)合業(yè)務(wù)復(fù)雜度,性能需求來做測試,做優(yōu)化。
- 通過分布式、拆表提高并發(fā)量。
不足之處,請各位指正。