mysql数据库 *** 作耗时很久是什么原因

mysql数据库 *** 作耗时很久是什么原因,第1张

Mysql查询语句慢,执行时间长和等待时间长的原因

没有索引或没用好索引(单值索引和复合索引)

关联查询太多join,

服务器调优及各个参数设置(缓冲,线程数等)

C#和MS SQL交互使用的技术叫做 ADONET。 使用ADONET可以方便的对SQL SERVER 进行 *** 作。

(如果你对ADONET不了解,建议先MSDN一下)

批量插入数据,有两种方式,

1,数据比较复杂但是量不是很大,(这个大小的概念要视你的硬件、网络而定,一般在100万条以上才叫大)。

使用FOR循环进行插入, 即声明连接(connOpen)然后进行遍历,

一条一条插入数据库(执行Insert语句),

一般来说,100W条数据,如果插入本机数据库的话, 耗时一般在40S-1分钟左右,

也可以在SqlServer中创建一个存储过程来执行Insert命令, 遍历时只需要调用存储过程即可,  存储过程的执行效率比Sql语句要高很多,因为不需要每次都编译。

100W条数据用存储过程来执行的话,一般耗时在20S左右,。

2数据量巨大,但是类型较简单,(一般指上百万条数据)

使用ADONET提供的BulkCopy,即批量导入,

语法:

 public static void BulkToDB(DataTable dt, string TableName)

        {

            SqlConnection sqlConn = new SqlConnection(

            ConfigurationManagerConnectionStrings["dbconnstr"]ConnectionString);

            

            SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn);

            bulkCopyBulkCopyTimeout = 600;

            bulkCopyDestinationTableName = TableName;

            bulkCopyBatchSize = dtRowsCount;

            try

            {

                sqlConnOpen();

                if (dt != null && dtRowsCount != 0)

                    bulkCopyWriteToServer(dt);

            }

            catch (Exception ex)

            {

                throw ex;

            }

            finally

            {

                sqlConnClose();

                if (bulkCopy != null)

                    bulkCopyClose();

            }

        }

需要传入一个DataTable,一个表名。 

这种方式速度非常快,同样100W条数据,本机导入,大概3-5秒就可以完成,

但是需要注意,传入的DataTable必须和Sql Server中的表结构一模一样,

比如你的表有3列,分别是Name, Age, Sex。  你传入的DataTable也必须是如此,所以这种方式只适合导入一些基础数据, 并不适合作为数据层的常用方法。

如果数据量巨大又要求很高的效率,更建议使用NoSql数据库

SQLite 因其小巧轻便被安卓系统广泛采用,当然在 *** 作小数据量时,差异并不明显;但当 SQLite 在 *** 作略大一点的数据时就显得力不存心了,这时的 CRUD *** 作对移动存储设备的性能有着极大的要求,另外用户体验的良好性也对 SQLite 的性能优化提出了要求。那么,当我们在 *** 作大数据量时如何对 SQLite 进行优化呢?正确的 *** 作是:开启事务。下面我们通过采用不同的方式向数据库中插入 10000 条数据来进行比较以体现开启事务对 SQLite 性能提升方面所做出的贡献。首先看一张截图来进行一个感性的认识:

源码及安装文件下载方式一:SQLiteDataBasezip

从上图中我们会很清晰的看到通过普通方式插入 10000 条数据和开启事务插入 10000 条数据之间的差异,整整差了 83 秒。下面我们来看测试代码:

package cnsunznsqlitedatabase;

import androidappActivity;

import androidcontentContentValues;

import androiddatabasesqliteSQLiteDatabase;

import androidosBundle;

import androidosHandler;

import androidosMessage;

import androidviewMenu;

import androidviewView;

import androidwidgetEditText;

public class MainActivity extends Activity {

protected static final int SUCCESS_INSERT_TO_DB_ONE = 1;

protected static final int SUCCESS_INSERT_TO_DB_TWO = 2;

private EditText et_usedtime1;

private EditText et_usedtime2;

Handler handler = new Handler() {

public void handleMessage(Message msg) {

superhandleMessage(msg);

switch (msgwhat) {

case SUCCESS_INSERT_TO_DB_ONE:

Integer usetime_one = (Integer) msgobj;

et_usedtime1setText("插入10000条数据耗时:" + usetime_one / 1000 + "秒");

break;

case SUCCESS_INSERT_TO_DB_TWO:

Integer usetime_two = (Integer) msgobj;

et_usedtime2setText("插入10000条数据耗时:" + usetime_two / 1000 + "秒");

break;

default:

break;

}

}

};

public void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutactivity_main);

et_usedtime1 = (EditText) findViewById(Ridet_usedtime1);

et_usedtime2 = (EditText) findViewById(Ridet_usedtime2);

}

/

1 普通方式插入数据库 10000 条数据

/

public void insert1(View view) {

MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(getApplicationContext());

final SQLiteDatabase database = openHelpergetWritableDatabase();

if (databaseisOpen()) {

new Thread() {

public void run() {

long start = SystemcurrentTimeMillis();

for (int i = 0; i < 10000; i++) {

ContentValues values = new ContentValues();

valuesput("name", "tom:" + i);

databaseinsert("person", "_id", values);

}

databaseclose();

long end = SystemcurrentTimeMillis();

int usetime_one = (int) (end - start);

Message message = new Message();

messagewhat = SUCCESS_INSERT_TO_DB_ONE;

messageobj = usetime_one;

handlersendMessage(message);

};

}start();

}

}

/

2 开启事务插入数据库 10000 条数据

/

public void insert2(View view) {

MySQLiteOpenHelper openHelper = new MySQLiteOpenHelper(getApplicationContext());

final SQLiteDatabase database = openHelpergetWritableDatabase();

if (databaseisOpen()) {

new Thread() {

public void run() {

long start = SystemcurrentTimeMillis();

databasebeginTransaction();

for (int i = 0; i < 10000; i++) {

ContentValues values = new ContentValues();

valuesput("name", "tom:" + i);

databaseinsert("person", "_id", values);

}

databasesetTransactionSuccessful();

databaseendTransaction();

databaseclose();

long end = SystemcurrentTimeMillis();

int usetime_two = (int) (end - start);

Message message = new Message();

messagewhat = SUCCESS_INSERT_TO_DB_TWO;

messageobj = usetime_two;

handlersendMessage(message);

};

}start();

}

}

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater()inflate(Rmenuactivity_main, menu);

return true;

}

}

为什么只是开启了一个事务就会有这么大的差距呢?很简单,SQLite 缺省为每个 *** 作开启了一个事务,那么测试代码循环插入 10000 次开启了 10000 个事务,"事务开启 + SQL 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显式开启事务后为什么如此快的原因。

2小时。

使用数据库时,用java编程把数据写入,每组数据写入时间平均是2小时,然后用查询语句读每组数据。

数据库是按照数据结构来组织、存储和管理数据的仓库。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。

以上就是关于mysql数据库 *** 作耗时很久是什么原因全部的内容,包括:mysql数据库 *** 作耗时很久是什么原因、c#怎样向sqlserver批量插入数据、android手机上sqllite插入数据的性能是多少等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9379057.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存