0

我有这个查询,它工作正常。

SELECT SUM(amount) FROM company.invoice_line WHERE item_id != shipping 
    AND item_id != '' 
    AND invoice_id IN 
        (SELECT id_invoices FROM company.invoices WHERE customer = 'XX' 
            AND sales_rep = 'XXX');

目的是总结代表从客户那里获得的所有销售额。客户代表数据相关并存储在表invoice中,invoice line表与表相关invoice

对于我正在使用的数据大小,查询大约需要 0.015 秒

id_invoices我在查询中用另一个 VARCHAR PK更改了查询,但没有标记为唯一或不是。

原因是之前,我有一个糟糕的设计,其中 aninvoice将被插入到数据库中,然后会立即执行一个查询,要求将invoice的自动递增 PK 用作外键。

为了有效地使用 BULK INSERT,我需要访问几乎所有数据的唯一标识符,而不依赖于自动递增的“普通”INT PK。我按照上面所说的那样完成了这一点,并添加了额外的列作为外键等。

我的插入速度现在很棒,但现在查询需要 7+ seconds

重申一下,在此之前,我使用 vanilla auto-increment int 作为 PK。将外键切换为 VARCHAR 真的会破坏性能吗?

我的下一步似乎是恢复到 int id,但不是允许 MySQL 在插入时自动递增,而是手动创建这些 int 索引,以便我仍然可以使用批量插入。从查询的角度来看,这应该没关系......应该吗?

任何帮助,将不胜感激。

丹麦人

4

1 回答 1

1

好的,首先您需要使用 EXPLAIN 来确定查询计划中发生了什么,以查看其他可能发生的变化。

其次,VARCHAR 列的匹配速度比 INT 列慢,尽管通常它只是不断增加(例如,它是 k*O(n) vs O(n),其中 k 与 n 无关)。....除非两个表上的字符集不同。然后它就变成了一个大问题,因为 MySQL 试图匹配两个不同的字符集。谁知道为什么,它只是慢mmkay。

第三,你的插入真的慢到需要这种大规模的重新设计吗?从您的问题中不清楚您在做什么,但是很难看出随机插入的性能如何对您的工作量造成如此大的影响,以至于您需要制作一个非常非标准的表结构,这使得其他一切工作变得更加困难和缓慢周围?

最后,关于批量插入的最后一个问题 - 如果您预先创建行,插入将不起作用(除非您使用 ON DUPLICATE KEY 执行某些操作)。但我总是会尝试在这类事情上坚持使用 int ID,除非有很好的理由不这样做。

于 2012-04-24T05:25:10.037 回答