1

我对我的 SQL 作业感到困惑。我不是数据库专家。我正在使用 MySQL。

我有一个名为“新闻”的表

create table news
    title text not null,
    time DATE,
    ip varchar(15),
    reporter varchar(25),
    tag varchar(20),
    id int not null auto_increment,
    primary key(id)
)engine=innodb;

我有一个包含 1000000 行数据的 txt 文件“news2.txt”。

我想优化我的 sql 以提高速度。

这是我的 SQL 语句

SET UNIQUE_CHECKS=0;
SET AUTOCOMMIT=0;

load data local infile "e:/news2.txt" into table news fields terminated by ',' LINES TERMINATED BY '\n' (title,time,ip,reporter,tag); 

SET UNIQUE_CHECKS=1;
SET AUTOCOMMIT=1;

'news2.txt' 包含类似* ' Vivamus dictum ultrices Curae aliquet vel nunc Aenean,2013/10/8,10.0.0.252,Reed Wyatt,Science '*这是一行。

执行时间为 29.188 秒。我的桌子设计有问题吗?我该怎么做才能让它更快?

4

2 回答 2

0

数据加载

一百万个条目需要一些时间才能写入磁盘。检查表的大小并想象它不只是复制文件,它正在执行一些计算以便将其保存为数据库记录。

除非作业清楚地表明速度至关重要(我怀疑它会),否则这不是值得关注的事情。

在一个正常的应用程序中,在 26 秒内向新闻表中插入 100 万个条目是非常好的性能......更不用说“从哪里找到所有这些新闻文章”?在现实生活中,应用层很可能会减慢速度。

交易

您可以从那里删除“autocommit = 0”(如果您不需要它),因为这意味着整个加载操作正在以事务方式运行,这意味着数据库引擎需要将所有内容写入临时位置并检查是否每次插入(在您拥有的一百万个中)在提交数据之前是成功的。

使用“autocommit=1”运行将使数据库引擎将每个插入作为事务处理。

通常每个语句一个事务会产生一定程度的“事务性”开销,运行批量事务(每个事务 50-100 个语句)以最小化开销是一种很好的做法,但在非常大的事务的情况下,开销会增加并且不能保存在内存中,因此需要将其写入磁盘,这会使工作速度变慢——在这种情况下,最好每条语句使用一个事务(可以从内存中运行)而不是每整个批处理一个事务。

于 2013-11-04T09:15:20.627 回答
0

桌子很简单,所以设计还可以。只有我认为您会想要添加一些索引来加速对表进行的查询。

但是 LOAD DATA LOCAL 存在潜在的安全问题,具体取决于您的工作流程。

于 2013-11-04T12:02:44.593 回答