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插入数据的性能是多少等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)