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

PHP往Mysql里插入唯一隨機字符串的效率問題

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

現(xiàn)在的做法:

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

代碼有小錯誤

$this->generateUniqueValidationCodes($number);

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

2017年1月23日 01:52
編輯回答
蔚藍色

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

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

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

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

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

2018年8月7日 11:22