Mysql 多个插入的更好选择,而不是函数
在我的sql数据库中,有一个过程需要在表中插入大量随机生成的记录。 大概是这样的:Mysql 多个插入的更好选择,而不是函数,mysql,performance,Mysql,Performance,在我的sql数据库中,有一个过程需要在表中插入大量随机生成的记录。 大概是这样的: insert into table_AAA SELECT , round(X + rand() * 10 - rand() * 10 ) , round(Y + rand() * 10 - rand() * 10 ) FROM db_numbers d /*very big table containing just 1 column with numbers from 1 to 1M*/ li
insert into table_AAA
SELECT
, round(X + rand() * 10 - rand() * 10 )
, round(Y + rand() * 10 - rand() * 10 )
FROM db_numbers d /*very big table containing just 1 column with numbers from 1 to 1M*/
limit 100000;
这需要3秒钟,与我的服务器的其他程序相比,听起来还算合理
然后,如果这一轮的结果大于等于0,我必须这样做
为此,我制作了一个函数:
CREATE FUNCTION `fn_normalize`(`p_value` INT) RETURNS int(11)
BEGIN
declare v_output INT;
IF p_value < 0 THEN
SET v_output = 0 ;
ELSE SET v_output = p_value ;
END IF;
RETURN (v_output);
END
非常慢,是原来的10倍,可能是因为函数分别处理每个值
我想在以下情况下使用该用例:
insert into table_AAA
SELECT
, case when(round(X + rand() * 10 - rand() * 10 )) < 0 then 0 else (round(X + rand() * 10 - rand() * 10 )) end
, case when(round(Y + rand() * 10 - rand() * 10 )) < 0 then 0 else (round(X + rand() * 10 - rand() * 10 )) end
FROM db_numbers d /*very big table containing just 1 column with numbers from 1 to 1M*/
limit 100000;
但是else将重新运行rand函数,所以我不能确定它是一个正数。使用randx不是一个选项,因为我需要最随机的值
在最糟糕的插入之后进行更新
我是否错过了一些明显的选择
非常感谢您可以使用子查询:
insert into table_AAA
SELECT CASE WHEN v.x<0 THEN 0 ELSE v.x END,
CASE WHEN v.y<0 THEN 0 ELSE v.y END,
FROM (
SELECT
round(X + rand() * 10 - rand() * 10 ) AS x
, round(Y + rand() * 10 - rand() * 10 ) AS y
FROM db_numbers d /*very big table containing just 1 column with numbers from 1 to 1M*/
limit 100000) v;
您可以使用子查询:
insert into table_AAA
SELECT CASE WHEN v.x<0 THEN 0 ELSE v.x END,
CASE WHEN v.y<0 THEN 0 ELSE v.y END,
FROM (
SELECT
round(X + rand() * 10 - rand() * 10 ) AS x
, round(Y + rand() * 10 - rand() * 10 ) AS y
FROM db_numbers d /*very big table containing just 1 column with numbers from 1 to 1M*/
limit 100000) v;
更简单、更快的函数体:
RETURN GREATEST(0, p_value);
或者,将其应用于davide的解决方案:
insert into table_AAA
SELECT
GREATEST(0, round(X + rand() * 10 - rand() * 10 )) AS x,
GREATEST(0, round(Y + rand() * 10 - rand() * 10 )) AS y
FROM db_numbers d /* table of numbers from 1 to 1M*/
limit 100000) v;
更简单、更快的函数体:
RETURN GREATEST(0, p_value);
或者,将其应用于davide的解决方案:
insert into table_AAA
SELECT
GREATEST(0, round(X + rand() * 10 - rand() * 10 )) AS x,
GREATEST(0, round(Y + rand() * 10 - rand() * 10 )) AS y
FROM db_numbers d /* table of numbers from 1 to 1M*/
limit 100000) v;
只是好奇,X+rand*10-rand*10的意义是什么?为什么不干脆用X+rand*10?对我来说没有意义…只是好奇,X+rand*10-rand*10有什么意义?为什么不干脆用X+rand*10?对我来说没有意义。。。