[英]Is there a function similar to generate_series function in PostgreSQL?
PostgreSQL 中的 generate_series 函數可以非常快速地生成大量數據。 但是因為對MySQL不熟悉,寫了一個存儲過程,發現生成數據的速度很慢。
delimiter $$
CREATE PROCEDURE inst_para_select(IN n int)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= n DO
INSERT INTO `para_select` VALUES(i,CONCAT(i,'_test'),NOW());
SET i = i+1;
END WHILE;
END $$
delimiter;
有沒有更好的方法可以在 MySQL、函數或存儲過程中快速創建大量數據?
我見過的每個 MySQL 性能良好的解決方案都必須使用某種現有的數字表或視圖。 這限制了您在表或視圖中有多少行。
您可以制作一個盡可能大的連續整數表並完成它。
我遇到的更有趣的生成實現之一是 Markus Winand 。 他創建了一個從 0 到 15 的視圖。然后使用交叉連接和位數學生成越來越大序列的視圖。
CREATE OR REPLACE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL
SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL
SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL
SELECT 15;
CREATE OR REPLACE VIEW generator_256
AS SELECT ( ( hi.n << 4 ) | lo.n ) AS n
FROM generator_16 lo, generator_16 hi;
CREATE OR REPLACE VIEW generator_4k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
FROM generator_256 lo, generator_16 hi;
CREATE OR REPLACE VIEW generator_64k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
FROM generator_256 lo, generator_256 hi;
CREATE OR REPLACE VIEW generator_1m
AS SELECT ( ( hi.n << 16 ) | lo.n ) AS n
FROM generator_64k lo, generator_16 hi;
這些視圖將始終構建完整的笛卡爾積。 盡管您可以使用 where 子句限制結果,但生成所有行的工作仍然完成。 它只是過濾不需要的。 這意味着,如果您只需要幾行,那么使用大型生成器視圖是非常低效的。
始終使用盡可能小的發電機以獲得最佳性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.