优化Mysql查询(rawdata到已处理的表)

时间:2015-09-30 14:03:14

标签: mysql database

大家好,所以我的问题就是这个,所以我有一个文件,通过本地infile命令读取大约3000行数据。在此之后,表格中有一个触发器,它会从更新的表中复制三列,并且已经存在于数据库中的表中的两列(如果我不清楚我的意思是结构即将到来) )。从那里只有具有唯一glNumbers的组合将被输入到已处理的表中。这通常需要一分半钟。我发现这很长,我想知道这对我正在做的事情是否正常(不能相信这是真的)还是有办法优化查询以使其更快?< / p>

插入的表格标记为每个月的前三个字母。这是默认结构。

RawData结构

| idjan | glNumber  | journel  | invoiceNumber  | date  | JT  | debit  | credit | descriptionDetail  | totalDebit  | totalCredit |

(对不起)对于糟糕的格式,似乎没有一种非常好的方法可以做到这一点)

插入触发查询后

delete from processedjan;
insert into processedjan(glNumber,debit,credit,bucket1,bucket2)
select  a.glNumber, a.totalDebit, a.totalCredit, b.bucket1, b.bucket2
from jan a inner join bucketinformation b on a.glNumber = b.glNumber
group by glNumber;

已处理的数据表结构

| glNumber | bucket1 | bucket2 |信用|借记|

另外我想知道存储桶1和存储桶2来自另一个与glNumber匹配的表是有帮助的。该表大约有800行,glNumber和两个桶有三列。

1 个答案:

答案 0 :(得分:0)

虽然postgresql具有语句级触发器,但mysql只有行级触发器。来自mysql reference

  

定义触发器以在语句插入,更新或时激活   删除关联表中的行。这些行操作是触发器   事件。例如,行可以通过INSERT或LOAD DATA插入   语句,并为每个插入的行激活插入触发器。

因此,当您在一次操作中设法加载3000行时,不幸的是触发器会执行3000多个查询。但是,您的交易的复杂性质听起来可能实际上每行执行2-3次查询。这是减速的真正原因。

您可以通过禁用触发器并在文件中加载数据后执行INSERT .. SELECT来加快速度。您可以使用小脚本自动执行它。