MySQL 大数据入库 (单一表)

        最近一段时间在研究数据入库,对于INSERT命令,少量数据时可以满足,而对于大量数据插入同一个表的时候速度很慢,明显不符合要求。于是从网上找了一下,MYSQL中有一个LOAD DATA INFILE命令。在此简单说一下LOAD DATA INFILE的作用:它主要将文件中记录批量录入表中,速度非常快。但只能对于一个表进行操作,也就是说所有的记录都是一个表中的,有一定的局限性。

        下面贴上代码,我是用C++测试的。

#include <Windows.h>
#include <iostream>
#include <fstream>

using namespace std;

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")


//导入数据文件
//conn 数据库连接
//command 命令
int LoadDataFile(_ConnectionPtr & conn, char * command)
{
	try
	{
		conn->Execute(command, NULL, 0);	//执行导入文件命令
	}
	catch (_com_error &e)
	{		
		cout<<e.Description()<<endl;	//如果错误输出错误信息
		system("pause");
		return 1;
	}
	return 0;
}

//创建大数据文件
void CreateDataFile()
{
	char temp[1024];
	fstream gOutFile;
	gOutFile.open("d:\\data0.txt",		//文件最好用绝对路径,方便查找
		ios::out | ios::trunc);
	for (int i = 0; i < 100000; i++)	//构造10W条记录
	{
		sprintf_s(temp, 1024, "%d|@@|name%d|@@|0|@@|2012-10-10 10:22:27|@@|content|<>|"
			, i+1
			, i+1);		//这里是格式化每一条数据,列之间用|@@|隔开,每条记录之间用|<>|隔开
		gOutFile.write(temp, strlen(temp));
	}
	gOutFile.close();
}

int main()
{
	int startTime, endTime;
	char command[1024];
	//构建导入文件命令
	sprintf_s(command, 1024, "LOAD DATA INFILE 'D:/data0.txt' \
							 INTO TABLE T_TEST \
							 FIELDS TERMINATED BY '|@@|' \
							 LINES TERMINATED BY '|<>|'");

	//初始化库
	CoInitialize(NULL); 

	_ConnectionPtr m_pConnection;
	//创建数据库连接实例
	m_pConnection.CreateInstance("ADODB.Connection");   
	try 
	{
		//打开数据库连接,数据库连接字符串在下面详细介绍
		HRESULT hr = m_pConnection->Open(
			"DRIVER={MySQL ODBC 5.1 Driver}; SERVER=localhost; DATABASE=test;",
			"root",
			"123456",
			adModeUnknown);
	}  
	catch(_com_error &e)  
	{
		cout<<e.Description()<<endl;
		system("pause");
		return 1;
	}

	//创建数据文件
	CreateDataFile();

	//计时开始
	cout<<"Start:\t"<<(startTime = GetTickCount())<<endl;
	//录入文件
	LoadDataFile(m_pConnection, command);
	//计时结束
	cout<<"End:\t"<<(endTime = GetTickCount())<<endl;
	cout<<"Total:\t"<<startTime-endTime<<" ms"<<endl;

	//库清理
	CoUninitialize();
	system("pause");
	return 0;
}

 

           关于MYSQL的连接字符串:

                 m_pConnection->Open("DRIVER={MySQL ODBC 5.1 Driver}; SERVER=localhost; DATABASE=test;","root","123456",adModeUnknown);

           {MySQL ODBC 5.1 Driver}是MySql的ODBC驱动,官网上有下载,5.1是版本

           SERVER是mysql安装电脑的IP,如果是本地用localhost就可以.

           DATABASE是要连接的数据库。

           Open方法中"root"是数据库用户名 “123456”是用户密码。

 

           测试步骤:1.新建一个数据库test 

                             2.在这个数据库下执行以下数据库脚本

 

                                CREATE TABLE T_TEST(
                                                      F_ID BIGINT PRIMARY KEY,
                                                      F_NAME VARCHAR(32),
                                                      F_SEX SMALLINT,
                                                      F_BIRTHDAY DATETIME,
                                                      F_CONTENT VARCHAR(512));

                             3. 执行程序时确保T_TEST表为空.

                             4. 测试结果是10W条数据在1s左右可以入库

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在MySQL大数据中增加字段,可以通过以下步骤进行: 1. 首先,使用ALTER TABLE语句来修改结构。例如,要添加一个名为new_column的新字段,可以使用以下语句: ``` ALTER TABLE table_name ADD new_column data_type; ``` 其中,table_name是要修改的的名称,new_column是要添加的字段名称,data_type是新字段的数据类型。根据需要选择合适的数据类型,如VARCHAR、INT、DATETIME等。 2. 如果需要在新字段上设置约束条件,比如唯一性约束或非空约束,可以在ALTER TABLE语句中添加相应的约束定义。例如,要在new_column字段上添加非空约束,可以使用以下语句: ``` ALTER TABLE table_name MODIFY new_column data_type NOT NULL; ``` 在这个例子中,使用MODIFY关键字来修改字段定义,并添加了NOT NULL约束。 3. 当中存在大量数据时,修改结构可能需要一些时间。为了避免对生产环境的影响,可以考虑在非高峰时间进行该操作,或者使用在线DDL工具来避免锁定。 4. 在添加新字段之后,可能需要更新已有数据以满足新字段对数据的要求。可以使用UPDATE语句来更新中的数据。例如,如果新字段要求唯一值,可以使用以下语句进行更新: ``` UPDATE table_name SET new_column = some_value WHERE new_column IS NULL; ``` 在这个例子中,将中new_column字段的空值设置为某个唯一值some_value。 通过上述步骤,可以在MySQL大数据中成功添加新字段。需要注意的是,修改结构可能会对性能产生一定影响,因此在操作之前需要做好充分的测试和备份工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值