优化MySQL或表设计

时间:2013-11-04 07:19:22

标签: mysql sql database-design

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

我有一张名为'news'的表

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秒。我的桌子设计有问题吗?我该怎么做才能让它更快?

2 个答案:

答案 0 :(得分:0)

数据加载

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

除非家庭作业明确表明速度至关重要(我怀疑它会如此),否则不值得关注。

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

交易

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

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

通常每个语句的一个事务会产生一定程度的“事务”开销,并且运行批处理事务(每个事务50-100个语句)以最小化开销是一个好习惯,但是在非常大的事务处理的情况下,开销是构建并且不能保存在内存中,因此需要将其写入磁盘,这会使事情变得更慢 - 在这种情况下,最好每个语句使用一个事务(可以从内存运行),而不是每个批处理使用一个事务。

答案 1 :(得分:0)

表非常简单,所以设计还可以。只有我认为你会想要添加一些索引来加速对表的查询。

但根据您的工作流程,可能存在security issue with LOAD DATA LOCAL