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