如何在MySQL中大規模注入簡單的虛擬數據

PHPz
發布: 2024-07-18 08:24:19
原創
862 人瀏覽過

How to inject simple dummy data at a large scale in MySQL

介紹

您是否曾經遇到過需要大量虛擬資料進行測試,但又不想花費數小時編寫腳本或手動插入記錄的情況?或者您可能對如何利用 MySQL 8.0 中的新功能來簡化資料庫任務感到好奇?好吧,你可要好好享受一下了!在這篇文章中,我們將探討如何使用通用表格運算式 (CTE) 輕鬆產生大量虛擬資料並將其插入 MySQL 資料庫中。

想像一下需要在表中填充一百萬個雜湊值以進行負載測試或效能基準測試。聽起來像是場惡夢,對吧?不再!隨著 MySQL 8.0 中 CTE 的出現,您可以在幾秒鐘內實現這一目標。讓我們深入了解它的工作原理以及如何使用這個強大的功能來簡化您的資料生成需求。

TL; DR

通用表格運算式(CTE)是 MySQL 8.0 中新增的功能,可用於輕鬆輸入大量簡單的虛擬資料。例如,如果您想要將 100 萬個虛擬資料輸入到一個名為 hashes 的儲存雜湊值的表中,您可以透過以下步驟實作:

表定義

首先,建立表格:

CREATE TABLE hashes (
  id INT PRIMARY KEY AUTO_INCREMENT,
  hash CHAR(64)
);
登入後複製

查詢執行

設定會話變數以允許更高的遞歸深度:

SET SESSION cte_max_recursion_depth = 1000000;
登入後複製
登入後複製

然後,執行CTE插入100萬行:

INSERT INTO hashes(hash)
WITH RECURSIVE cte (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte WHERE n < 1000000
)
SELECT SHA2(n, 256) FROM cte;
登入後複製
登入後複製

此方法利用遞歸公用表表達式來產生虛擬資料。

了解 CTE

公用表表達式(CTE)是一個命名的臨時結果集,可以在單一語句中多次引用。 CTE 對於簡化複雜查詢和提高可讀性特別有用。

語法細目

設定遞歸深度

SET SESSION cte_max_recursion_depth = 1000000;
登入後複製
登入後複製

cte_max_recursion_depth系統變數設定遞歸的上限。預設情況下,它是1000,所以要遞歸更多,你需要調整它。在這裡,我們將其設置為 100 萬。

CTE 查詢

INSERT INTO hashes(hash)
WITH RECURSIVE cte (n) AS
(
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM cte WHERE n < 1000000
)
SELECT SHA2(n, 256) FROM cte;
登入後複製
登入後複製

讓我們分解這個查詢:

  • WITH RECURSIVE cte (n):這將啟動 CTE 定義。 cte 是臨時結果集的名稱,n 是列。

  • SELECT 1:這是CTE的非遞迴部分,作為起點(初始值)。

  • UNION ALL SELECT n + 1 FROM cte WHERE n <; 1000000:這是遞迴部分,它將 n 的值增加 1,直到達到 1,000,000。

  • 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 hashes(hash)
    -> WITH RECURSIVE cte (n) AS
    -> (
    ->   SELECT 1
    ->   UNION ALL
    ->   SELECT n + 1 FROM cte WHERE n < 1000000
    -> )
    -> SELECT SHA2(n, 256) FROM cte;
Query OK, 1000000 rows affected (4.43 sec)
Records: 1000000  Duplicates: 0  Warnings: 0
登入後複製

績效指標

Number of Rows Execution Time
1,000 0.03 sec
10,000 0.07 sec
100,000 0.42 sec
1,000,000 4.43 sec
10,000,000 48.53 sec

結論

在 MySQL 8.0 中使用 CTE 可以快速產生大量虛擬數據,這徹底改變了遊戲規則。它對於負載測試和效能基準測試特別方便。只需幾行程式碼,您就可以輕鬆填充表格,然後返回專案的其他重要部分。

不要猶豫,嘗試不同的資料產生策略和遞歸深度,看看哪種最適合您。有關安全性和日誌分析的更多提示和見解,請在 Twitter 上關注我@Siddhant_K_code,並隨時了解此類最新且詳細的技術內容。快樂編碼!

以上是如何在MySQL中大規模注入簡單的虛擬數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!