第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

批量 MySQL 插入比 PHP 慢 2 倍

批量 MySQL 插入比 PHP 慢 2 倍

Go
猛跑小豬 2023-05-08 16:01:28
我一直在測(cè)試 Go,希望將它用于新站點(diǎn),并希望確保它與 PHP 一樣快或更快。所以我運(yùn)行了一個(gè)基本測(cè)試,在 Go 和 PHP 中進(jìn)行批量插入,因?yàn)槲倚枰坎迦搿N业臏y(cè)試使用事務(wù)、準(zhǔn)備好的語(yǔ)句、同一臺(tái)機(jī)器、完全相同的表定義、沒(méi)有索引但 PK 以及函數(shù)中的相同邏輯。結(jié)果:PHP (mysqli) 中的 100k 插入是 4.42 秒Go(Go-MySQL-Driver)中的 100k 插入是 9.2 秒我正在使用的 go mysql 驅(qū)動(dòng)程序是在這里找到的最受歡迎的“Go-MySQL-Driver”:https: //github.com/go-sql-driver/mysql我想知道是否有人可以告訴我我在 go 中的代碼是否設(shè)置不正確,或者 go 是否就是這樣。這些函數(shù)為一些行變量添加了一些可變性,因此每一行都不相同。去功能:func fill_table(w http.ResponseWriter, r *http.Request, result_string *string, num_entries_to_add int) {    defer recover_show_error(result_string)    db := getDBConn()    defer db.Close()    var int_a int = 9      var int_b int = 4      var int_01 int = 1               var int_02 int = 1451628000 // Date Entered  (2016-1-1, 1am)    var int_03 int = 11             var int_04 int = 0    var int_05 int = 0    var float_01 float32 = 90.0 // Value    var float_02 float32 = 0    var float_03 float32 = 0    var text_01 string = ""     var text_02 string = ""    var text_03 string = ""    start_time := time.Now()    tx, err := db.Begin()    if err != nil {        panic(err)    }    stmt, err := tx.Prepare("INSERT INTO " + TABLE_NAME +        "(`int_a`,`int_b`,`int_01`,`int_02`,`int_03`,`int_04`,`int_05`,`float_01`,`float_02`,`float_03`,`text_01`,`text_02`,`text_03`) " +        "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)")    if err != nil {        panic(err)    }    defer stmt.Close()    var flip int = 0    for i := 0; i < num_entries_to_add; i++ {        flip = ((int)(i / 500)) % 2        if flip == 0 {            float_01 += .1 // add to Value        } else {            float_01 -= .1 // sub from Value        }        int_02 += 1 // add a second to date.        _, err = stmt.Exec(int_a, int_b, int_01, int_02, int_03, int_04, int_05, float_01, float_02, float_03, text_01, text_02, text_03)        if err != nil {            panic(err)        }    }    err = tx.Commit()    if err != nil {        panic(err)    }    elapsed := time.Since(start_time)    *result_string += fmt.Sprintf("Fill Table Time = %s</br>\n", elapsed)}
查看完整描述

1 回答

?
翻過(guò)高山走不出你

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊

在我為尋找我想為我的新網(wǎng)站使用哪種語(yǔ)言而進(jìn)行的測(cè)試中,我嘗試了 php、golang 和 java。我對(duì)任何一種語(yǔ)言都沒(méi)有太多經(jīng)驗(yàn),所以我在這里所說(shuō)的任何內(nèi)容都可能在將來(lái)被某人糾正。

我的主要測(cè)試是批量插入到 mysql 數(shù)據(jù)庫(kù)中,因?yàn)槲业膽?yīng)用程序需要它。

我想遠(yuǎn)離 php,因?yàn)樗且环N非編譯的舊腳本語(yǔ)言,在很多方面都比 golang 和 java 慢。對(duì)于很多事情來(lái)說(shuō),這也是一種笨拙的語(yǔ)法。然而,對(duì)于大型“事務(wù)”,php mysqli 實(shí)際上比 golang 快 2 倍,除非你笨拙地生成許多 go-routines 來(lái)劃分工作。

在我的測(cè)試和研究過(guò)程中,我發(fā)現(xiàn)了一些事情。

PHP mysqli“交易”api 可能正在使用某種批處理操作來(lái)完成“交易”,因?yàn)?mysqli 沒(méi)有單獨(dú)的批處理功能,而且交易比單次插入更快。但在大多數(shù)其他語(yǔ)言中,事務(wù)不會(huì)自動(dòng)批處理所有內(nèi)容,甚至不會(huì)增加執(zhí)行時(shí)間。它們只是一種機(jī)制,可以在出現(xiàn)問(wèn)題時(shí)回滾事務(wù)中的所有內(nèi)容。在其他語(yǔ)言中增加執(zhí)行時(shí)間的是使用批處理。

但是現(xiàn)在 go mysql 接口的一大問(wèn)題似乎是沒(méi)有真正支持批處理操作。通過(guò)這樣做,我能夠?qū)?go 的執(zhí)行時(shí)間從 9.2 秒縮短到 3.9 秒,而無(wú)需生成其他 go 例程。但是由于沒(méi)有真正的支持,批處理操作只為批處理的第一個(gè)操作返回一個(gè)結(jié)果集。這對(duì)我來(lái)說(shuō)毫無(wú)價(jià)值,因?yàn)槲倚枰獮椴迦氲男蟹祷?autoinc ID。此設(shè)置還有其他問(wèn)題,我不會(huì)深入探討。

所以最后我在 tomcat 服務(wù)器上嘗試了 java。Tomcat/java 的安裝比 go 復(fù)雜一點(diǎn),但是用 java 編程要容易得多,也自然得多。JDBC 是一個(gè)優(yōu)秀的驅(qū)動(dòng)程序,完全支持使用準(zhǔn)備好的語(yǔ)句進(jìn)行簡(jiǎn)單的批處理操作。它僅在 1 秒內(nèi)完成了 100k 次插入。這是我書(shū)中的明顯贏家。加上 java 語(yǔ)法比 golang IMO 自然得多。


查看完整回答
反對(duì) 回復(fù) 2023-05-08
  • 1 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)