1

我想创建一个简单的程序,它将用一些随机值填充 MySQL 数据库表 10 000 次。我想用两个引擎 InnoDB(它是标准的面向行的引擎)和 InfiniDB(指定的面向列的引擎)来测试在表中插入和读取的速度。知道怎么做吗?这是我的数据库中的一个表的示例:

CREATE  TABLE IF NOT EXISTS `mydb`.`tblVariable` (
  `idtblVariable` INT NOT NULL ,
   `name` VARCHAR(20) NULL ,
   `station_id` INT NULL ,  
   `description` VARCHAR(100) NULL ,
   `id_history` INT NOT NULL DEFAULT 0 ,
   `type` ENUM('Analog','Digital') NOT NULL
)

所以要解释一下..对于 idtblVariable,它将是从 1 到 10 000 的数字,随机名称可以是:PT1,...,PT10000 描述例如将是:a,a,a,a,10 000 次等. 客户端是程序,插入和读取是用C#的形式,经典的应用程序。这可以在批处理程序中完成吗???

4

2 回答 2

3

这是填充从 1 到 10000 的数字的另一个技巧。如果您创建一个临时表或表变量并用 0 到 9 的数字填充它,如下所示:

CREATE TABLE TEMP 
(Digit int);
INSERT INTO Temp VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);

然后你可以像这样生成从 1 到 10000 的数字:

INSERT INTO tblVariable (idtblVariable) 
SELECT id
FROM
(
SELECT t4.digit * 1000 + t3.digit * 100 + t2.digit * 10 + t1.digit + 1 AS id
FROM         TEMP AS t1
  CROSS JOIN TEMP AS t2
  CROSS JOIN TEMP AS t3
  CROSS JOIN TEMP AS t4
) t

SQL Fiddle 演示

于 2012-09-27T11:19:40.647 回答
1

这可以通过存储过程来完成,例如:

CREATE DEFINER = `root`@`localhost` PROCEDURE `NewProc`()
BEGIN
 #Routine body goes here...
DECLARE counter INT;
DECLARE i INT;

SET i = 0;
SET counter = 10000;

WHILE i < counter DO
    INSERT INTO tblVariable (idtblVariable, name, /*Other fields*/) 
    VALUES (i, CONCAT('PT',i), /*Other values*/);
    SET i = i + 1;
END WHILE;

END;

如果您遇到 MySQL 权限问题, 您可以删除/更新部分DEFINER =根localhost。更新:然后,在创建存储过程之后,您可以像这样调用该过程:@

CALL NewProc;
于 2012-09-27T11:09:55.997 回答