在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/人工智能  數(shù)據(jù)分析&挖掘  PHP  數(shù)據(jù)庫(kù)/ PHP往Mysql里插入唯一隨機(jī)字符串的效率問(wèn)題

PHP往Mysql里插入唯一隨機(jī)字符串的效率問(wèn)題

  1. 有一驗(yàn)證碼數(shù)據(jù)表,有200萬(wàn)條數(shù)據(jù),驗(yàn)證碼字段需要唯一
  2. 需要往這個(gè)表里插入大批量的數(shù)據(jù),每次插入幾萬(wàn)條左右數(shù)據(jù)
  3. 如何優(yōu)化每次的執(zhí)行時(shí)間

現(xiàn)在的做法:

  1. 先生成好包含唯一驗(yàn)證碼的數(shù)組。
  2. 根據(jù)數(shù)組去驗(yàn)證碼表里查,發(fā)現(xiàn)存在的 重新生成
  3. 5000 一次 分批插入
private function generateUniqueValidationCodes(int $number)
{
    // 生成指定數(shù)量的不重復(fù)的驗(yàn)證碼
    $codeArr = $this->generateUniqueCodes($number);
    // 去表中查詢是否有存在的
    $result = ValidationCode::query()->whereIn('validation_code', $codeArr)->get();
    // 如果有存在的重新生成
    if ($result->isNotEmpty()) {
        $this->generateUniqueValidationCodes($number);
    } else {
        return $codeArr;
    }
}
回答
編輯回答
雨蝶

代碼有小錯(cuò)誤

$this->generateUniqueValidationCodes($number);

這里還得加上return
驗(yàn)證碼字段需要唯一,好奇這個(gè)為什么要唯一?
唯一的話,你加上Unique Index好了

2017年1月23日 01:52
編輯回答
蔚藍(lán)色

代碼里有return的,沒(méi)寫完,另外數(shù)據(jù)表里也加有唯一的索引的,需要唯一是業(yè)務(wù)需要;我想請(qǐng)教的是還有其他優(yōu)化方法沒(méi)?

2017年9月22日 00:32
編輯回答
落殤

同意樓上的觀點(diǎn),不必要每次插入前查詢 有沒(méi)有重復(fù),直接加個(gè)unique索引,只要執(zhí)行你想要的次數(shù)就行了;
然后執(zhí)行成功說(shuō)明不重復(fù),如果失敗再重新調(diào)用一次就可以了。這樣省去了每次需要查詢的時(shí)間,效率會(huì)提高很多

2018年8月1日 07:26
編輯回答
舊時(shí)光

首先,既然需要唯一,那么就加唯一索引就能解決,然后失敗再遞歸執(zhí)行。而且驗(yàn)證碼既然是你自己定義的,那么生成規(guī)則也在你手上,你應(yīng)該從驗(yàn)證碼的生成規(guī)則上進(jìn)行區(qū)分,這樣基本保證了唯一性,沒(méi)必要考慮太多,簡(jiǎn)單問(wèn)題簡(jiǎn)單處理就好。

2018年8月7日 11:22