介紹
是否曾經(jīng)發(fā)現(xiàn)自己處于需要大量虛擬數(shù)據(jù)進(jìn)行測(cè)試,但又不想花費(fèi)數(shù)小時(shí)編寫腳本或手動(dòng)插入記錄的情況?或者您可能對(duì)如何利用 MySQL 8.0 中的新功能來簡(jiǎn)化數(shù)據(jù)庫任務(wù)感到好奇?好吧,你可要好好享受一下了!在這篇文章中,我們將探索如何使用通用表表達(dá)式 (CTE) 輕松生成大量虛擬數(shù)據(jù)并將其插入到 MySQL 數(shù)據(jù)庫中。
想象一下需要在表中填充一百萬個(gè)哈希值以進(jìn)行負(fù)載測(cè)試或性能基準(zhǔn)測(cè)試。聽起來像一場(chǎng)噩夢(mèng),對(duì)吧?不再!隨著 MySQL 8.0 中 CTE 的出現(xiàn),您可以在幾秒鐘內(nèi)實(shí)現(xiàn)這一目標(biāo)。讓我們深入了解它的工作原理以及如何使用這個(gè)強(qiáng)大的功能來簡(jiǎn)化您的數(shù)據(jù)生成需求。
TL; DR
公用表表達(dá)式(CTE)是MySQL 8.0中添加的新功能,可以用來輕松輸入大量簡(jiǎn)單的虛擬數(shù)據(jù)。例如,如果您想將 100 萬條虛擬數(shù)據(jù)輸入到一個(gè)存儲(chǔ)哈希值的名為 hashes 的表中,您可以通過以下步驟實(shí)現(xiàn):
表定義
首先,創(chuàng)建表:
創(chuàng)建表哈希( id INT 主鍵自動(dòng)遞增, 哈希 CHAR(64) );
登錄后復(fù)制
查詢執(zhí)行
設(shè)置會(huì)話變量以允許更高的遞歸深度:
設(shè)置會(huì)話cte_max_recursion_深度= 1000000;
登錄后復(fù)制
然后,執(zhí)行CTE插入100萬行:
插入哈希值(hash) 帶有遞歸 cte (n) AS ( 選擇1 聯(lián)合所有 從 cte 中選擇 n + 1,其中 n <p>此方法利用遞歸公用表表達(dá)式來生成虛擬數(shù)據(jù)。</p> <h2> 了解 CTE </h2> <p>公共表表達(dá)式(CTE)是一個(gè)命名的臨時(shí)結(jié)果集,可以在單個(gè)語句中多次引用。 CTE 對(duì)于簡(jiǎn)化復(fù)雜查詢和提高可讀性特別有用。</p> <h3> 語法細(xì)目 </h3> <h4> 設(shè)置遞歸深度 </h4> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">設(shè)置會(huì)話cte_max_recursion_深度= 1000000;
登錄后復(fù)制
cte_max_recursion_depth系統(tǒng)變量設(shè)置遞歸的上限。默認(rèn)情況下,它是1000,所以要遞歸更多,你需要調(diào)整它。在這里,我們將其設(shè)置為 100 萬。
CTE 查詢
插入哈希值(hash) 帶有遞歸 cte (n) AS ( 選擇1 聯(lián)合所有 從 cte 中選擇 n + 1,其中 n <p>讓我們分解這個(gè)查詢:</p>
登錄后復(fù)制
使用遞歸 cte (n):這將啟動(dòng) CTE 定義。 cte是臨時(shí)結(jié)果集的名稱,n是列。
SELECT 1:這是CTE的非遞歸部分,作為起點(diǎn)(初始值)。
UNION ALL SELECT n + 1 FROM cte WHERE n
SELECT SHA2(n, 256) FROM cte:查詢的最后部分選擇每個(gè) n 值的 SHA-256 哈希,生成用于插入的虛擬數(shù)據(jù)。
怎么運(yùn)行的
CTE 遞歸生成從 1 到 1,000,000 的數(shù)字。對(duì)于每個(gè)數(shù)字,它計(jì)算 SHA-256 哈希值并將其插入哈希表中。這種方法非常高效,并且利用 MySQL 的遞歸功能來無縫處理大數(shù)據(jù)量。
處理速度
驗(yàn)證環(huán)境
為了了解此功能的影響,我使用了 Gitpod Enterprise 工作區(qū),利用強(qiáng)大且短暫的環(huán)境來避免設(shè)置和安裝的麻煩。這是設(shè)置的概覽:
機(jī)器:Gitpod Enterprise XXLarge 工作區(qū)
操作系統(tǒng):Ubuntu 22.04.4 LTS(Jammy Jellyfish)
容器化:Docker 版本 26.0.1
MySQL 版本:官方 MySQL 8.0 Docker 鏡像
結(jié)果
對(duì)于 100 萬行,查詢執(zhí)行時(shí)間約為 4.46 秒:
mysql> INSERT INTO 哈希值(hash) -> 帶有遞歸 cte (n) AS -> ( -> 選擇 1 -> 聯(lián)合所有 -> 從 cte 中選擇 n + 1,其中 n ) -> 從 cte 中選擇 SHA2(n, 256); 查詢正常,1000000 行受影響(4.43 秒) 記錄:1000000 重復(fù):0 警告:0
登錄后復(fù)制
性能指標(biāo)
行數(shù) | 執(zhí)行時(shí)間 |
---|---|
1,000 | 0.03秒 |
10,000 | 0.07秒 |
100,000 | 0.42秒 |
1,000,000 | 4.43秒 |
10,000,000 | 48.53秒 |
結(jié)論
在 MySQL 8.0 中使用 CTE 改變了游戲規(guī)則,可以快速生成大量虛擬數(shù)據(jù)。它對(duì)于負(fù)載測(cè)試和性能基準(zhǔn)測(cè)試特別方便。只需幾行代碼,您就可以輕松填充表格,然后返回項(xiàng)目的其他重要部分。
不要猶豫,嘗試不同的數(shù)據(jù)生成策略和遞歸深度,看看哪種最適合您。有關(guān)安全性和日志分析的更多提示和見解,請(qǐng)?jiān)?Twitter 上關(guān)注我@Siddhant_K_code,并隨時(shí)了解此類最新且詳細(xì)的技術(shù)內(nèi)容。快樂編碼!