当前位置: 移动技术网 > IT编程>数据库>Mysql > mysql数据插入效率比较

mysql数据插入效率比较

2019年05月28日  | 移动技术网IT编程  | 我要评论

做数据插入时,发现之前上班做哪些办公系统压根就没考虑过数据库性能这些,因为涉及的数据量小,时间和效率看不出来,可当数据量很大了,大到了每秒需要10000次插入时,这时就不得不考虑你的sql 语句了。当插入100条数据,能想到的数据插入方式:

1:for循环100次,一次次插入数据。连接一次插入100次,这样是最费时间的也是最费io和连接的;

2:将100数据插入语句组成一个sql语句,然后连接一次,插入数据。这种费时比第一种要好。

3:使用事物,100次插入,最后一次事物commit; 这种比第二种更快;

4:使用insert语句本身的多数据插入;

当以上方法在少量的数据面前,几乎没什么差别,我们压根感觉不出来。可是,当数据量稍微提大点,比如一次10000条数据。插入的速度效率就出来;

这是mysql实例类;此实例提供mysql的连接,和数据库相关操作

public class mysqlinstance
  {
    //连接字符串
    private static string mysqlconnectionstr = "server =localhost;database=test;uid=root;pwd=password.1;";
    private static mysqlconnection _mysqlconnect;
    private static mysqlconnection mysqlconnect
    {
      get
      {
        if (null == _mysqlconnect)
        {
          _mysqlconnect = new mysqlconnection(mysqlconnectionstr);
        }
        return _mysqlconnect;
      }
    }
    private static mysqlcommand _mysqlcommand;
    private static mysqlcommand mysqlcommand
    {
      get
      {
        if (null == _mysqlcommand)
        {
          _mysqlcommand = mysqlconnect.createcommand();
        }
        return _mysqlcommand;
      }
    }
    //打开连接
    public static void openconnect()
    {
      mysqlconnect.open();
    }
    //关闭连接
    public static void closeconnect()
    {
      mysqlconnect.close();
    }
    public static mysqlconnection connection
    {
      get
      {
        return mysqlconnect;
      }
    }
    //防注入方式的插入数据
    //使用事务 10000插入,最后才一次事务提交
    public static int insertdata(string command, list<mysqlparameter> params)
    {
      //程序时间监控
      stopwatch sw = new stopwatch();
      //程序计时开始
      sw.start();
      openconnect();
      //事务开始
      mysqltransaction trans = mysqlconnect.begintransaction();
      mysqlcommand.commandtext = command;
      mysqlcommand.parameters.addrange(params.toarray());
      int count = 0;
      for (int i = 0; i < 10000; i++)
      {
        if (mysqlcommand.executenonquery() > 0)
          count++;
      }
      //事务提交
      trans.commit();
      closeconnect();
      mysqlcommand.parameters.clear();
      //计时停止
      sw.stop();
      timespan ts2 = sw.elapsed;
      console.writeline(ts2.totalmilliseconds);
      return count;
    }
    //查询出来的是mysqldatareader 要使用就不能关闭连接
    public static mysqldatareader selectdata(string sql)
    {
      stopwatch sw = new stopwatch();
      sw.start();
      // openconnect();
      mysqlcommand newcommond = new mysqlcommand(sql, mysqlconnect);
      mysqldatareader data = newcommond.executereader();
      // closeconnect();
      sw.stop();
      timespan ts2 = sw.elapsed;
      console.writeline(ts2.totalmilliseconds);
      return data;
    }
    /// <summary>
    /// 查询出来的是数据集合
    /// </summary>
    /// <param name="sql"></param>
    /// <returns></returns>
    public static dataset selectdataset(string sql)
    {
      mysqlcommand newcommond = new mysqlcommand(sql, mysqlconnect);
      mysqldataadapter adapter = new mysqldataadapter();
      adapter.selectcommand = newcommond;
      dataset ds = new dataset();
      adapter.fill(ds);
      return ds;
    }
    //不安全插入 有注入
    public static int insertdatasql(string sql)
    {
      // openconnect();
      mysqlcommand.commandtext = sql;
      int count = mysqlcommand.executenonquery();
      // closeconnect();
      return count;
    }
    //安全插入 参数使用@
    //不使用事务 10000次插入
    public static int insertdatanotran(string command, list<mysqlparameter> params)
    {
      stopwatch sw = new stopwatch();
      sw.start();
      openconnect();
      mysqlcommand.commandtext = command;
      mysqlcommand.parameters.addrange(params.toarray());
      int count = 0;
      for (int i = 0; i < 10000; i++)
      {
        if (mysqlcommand.executenonquery() > 0)
          count++;
      }
      closeconnect();
      mysqlcommand.parameters.clear();
      sw.stop();
      timespan ts2 = sw.elapsed;
      console.writeline(ts2.totalmilliseconds);
      return count;
    }
    //一次性拼10000个插入语句一次性提交
    public static void test4()
    {
      stopwatch sw = new stopwatch();
      sw.start();
      mysqlinstance.openconnect();
      mysqltransaction tran = mysqlinstance.connection.begintransaction();
      string command = string.empty;
      for (int i = 0; i < 10000; i++)
      {
        string temp = string.format("insert into test.testtable(pname,pwd) value ('{0}','{1}'); \r\n", "name" + i, "password." + i);
        command += temp;
      }
      mysqlinstance.insertdatasql(command);
      tran.commit();
      mysqlinstance.closeconnect();
      sw.stop();
      timespan ts2 = sw.elapsed;
      console.writeline(ts2.totalmilliseconds);
    }
 }

最后建立控制台程序,分别使用事务提交,不使用事务,和拼接10000条插入在组成事务,这三种方式做一个测试,打印出耗时。结果如图:

可以看到:10000次插入使用事务提交只用时4.7秒,而不使用事务用时311秒,拼装成10000次insert语句的耗时7.3秒。这里面耗时7.3秒的,理论上,在数据库sql执行上也应该和使用事务差不多,这里的耗时主要是用作字符串的拼接上,客户端耗时比较多;

贴上测试程序代码:

using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.threading.tasks;
using mysql.data;
using mysql.web;
using mysql.data.mysqlclient;
using system.diagnostics;
using system.data;
namespace mysqldemo01
{
  class program
  {
    static void main(string[] args)
    {      
      testinsert();
      console.readline();
    }
    //使用安全防注入 参数使用@ ,安全插入。
    public static void testinsert()
    {
      list<mysqlparameter> lmp = new list<mysqlparameter>();
      lmp.add(new mysqlparameter("@pname", "hello2"));
      lmp.add(new mysqlparameter("@pwd", "1232"));
      string command = " insert into test.testtable(pname,pwd) value(@pname,@pwd); ";
      mysqlinstance.insertdata(command, lmp);
      list<mysqlparameter> lmp2 = new list<mysqlparameter>();
      lmp2.add(new mysqlparameter("@pname", "hello2"));
      lmp2.add(new mysqlparameter("@pwd", "1232"));
      mysqlinstance.insertdatanotran(command, lmp2);
      test4();
    }
   }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对移动技术网的支持。如果你想了解更多相关内容请查看下面相关链接

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网