【问题标题】:Insert random data in MySql and PHP for benchmark在 MySql 和 PHP 中插入随机数据进行基准测试
【发布时间】:2020-01-16 03:46:33
【问题描述】:

我想知道是否有用于 mysql/php 基准测试的(免费)工具。

特别是,我想将数千条数据插入 MySQL 数据库,并使用并发查询测试应用程序,看看它是否能持续。也就是说,在最坏的情况下测试应用程序。

我看到了一些付费工具,但没有免费或可定制的。

有什么建议吗?或任何脚本?

谢谢

【问题讨论】:

标签: php mysql benchmarking


【解决方案1】:

在表格中插入一条记录。

然后做:

INSERT IGNORE INTO table SELECT FLOOR(RAND()*100000) FROM table;

然后多次运行该行。每次您将表中的行数加倍(并且加倍增长非常快)。这比在 PHP 或其他代码中生成数据要快很多。您可以修改从中选择 RAND() 的列,以及数字的范围。也可以随机生成文本,但工作量更大。

您可以同时从多个终端运行此代码来测试并发插入。 IGNORE 将忽略任何主键冲突。

【讨论】:

    【解决方案2】:

    创建一个循环(可能是无限的),不断将数据插入数据库并从那里开始测试。

    【讨论】:

    • 但是如何测试并发查询,这是:1000个查询-用户-同时?
    • @Lopis 您可以在命令行中运行 php 代码。打开 x 个命令行寡妇并运行你的循环 php 代码
    【解决方案3】:
    for($i=1;$i=1000;$i++){
        mysql_query("INSERT INTO testing VALUES ('".$i."')");
        //do some other testing
    }
    

    【讨论】:

    • 但是如何测试并发查询,这是:1000个查询-用户-同时?还有,如何控制主键:不重复,等等
    • @Lopis:不要把它作为主键——如果只是为了测试,没关系。同时?这将为每个页面请求添加 1000 倍的测试值。怎么了?
    【解决方案4】:
    for($i=1;$i<5000;$i++){
      $query = mysql_query("INSERT INTO something VALUES ($i)");
    }
    

    用你的桌子替换一些东西;D

    【讨论】:

      【解决方案5】:

      如果您想测试并发性,您将不得不线程化您的插入/更新语句。
      一种简单且非常简单的方法(无需进入 fork/threads 和所有爵士乐)将在 bash 中执行如下操作
      1.创建一个可执行的PHP脚本

      #!/usr/bin/php -q
      <?php
      /*your php code to insert/update/whatever you want to test for concurrency*/
      ?>
      

      2。通过附加 &amp; 在 for 循环中调用它,使其进入后台。

      #!/bin/bash
      for((i=0; i<100; i++))
      do
          /path/to/my/php/script.sh &;
      done
      wait;
      

      您始终可以通过创建多个具有各种插入/更新/选择查询的 php 脚本并通过 for 循环运行它们来扩展它(如果您想要更多负载,请记住将 i&lt;100 更改为更高的数字。只是不要忘记在调用脚本后添加&amp;。(当然,你需要chmod +x myscript.sh)
      编辑:添加了等待语句,在此下方您可以编写其他命令/东西,您可以在淹没您的 mysql 数据库后执行此操作。

      【讨论】:

        【解决方案6】:

        我快速搜索并在 MySQL 文档中找到了以下页面 => http://dev.mysql.com/doc/refman/5.0/en/custom-benchmarks.html。此页面包含以下有趣的链接:

        开源数据库基准,可在 http://osdb.sourceforge.net/.

        例如,您可以尝试 SysBench 和 DBT2,可在http://sourceforge.net/projects/sysbench/ 获取,以及 http://osdldbt.sourceforge.net/#dbt2。这些包裹可以带来 系统崩溃了,所以一定要在你的开发中使用它们 系统。

        为了让 MySQL 更快,您应该查看 Memcached 或 Redis 以缓存您的查询。我非常喜欢 Redis,感谢http://redistogo.com,您可以获得一个免费的(小型)实例。大多数情况下,READS 正在杀死您的服务器,而不是 WRITES,后者的频率较低(大多数情况下)。大多数情况下,当 WRITES 频繁出现时,丢失一些数据并不是什么大问题。 WRITE 率高的网站例如 Twitter 或 Facebook。但话又说回来,如果一条推文或 Facebook 墙上的帖子丢失,我不认为这是世界末日。就像我之前指出的那样,您可以使用 Memcached 或 Redis 轻松解决此问题。

        如果 WRITES 正在杀戮,您可以查看 bulk insert(如果可能)、transactional insert, delayed inserts when not using InnoDB 或 partitioning。如果数据不是很重要,您可以先将查询放在内存中,然后定期进行批量插入。这样,当您从 MySQL 读取数据时,您将返回过时的数据(可能是问题)。但是话说回来,当您使用 redis 时,您可以轻松地将所有数据存储在内存中,但是当您的服务器崩溃时,您可能会丢失数据,这可能是个大问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-22
          • 2011-08-17
          • 2023-03-13
          • 1970-01-01
          • 1970-01-01
          • 2020-12-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多