Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多个插入的更好选择,而不是函数_Mysql_Performance - Fatal编程技术网

Mysql 多个插入的更好选择,而不是函数

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

在我的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*/
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?对我来说没有意义。。。