Mysql 为什么更改为另一个主键索引会降低此查询的性能?
我有这个查询,它运行良好Mysql 为什么更改为另一个主键索引会降低此查询的性能?,mysql,Mysql,我有这个查询,它运行良好 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'); 目的是汇总客户的所
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');
目的是汇总客户的所有销售代表的销售额。客户和代表数据关联并存储在发票
表中,以及与发票
表相关的发票行
表中
对于我正在处理的数据大小,查询大约需要0.015秒
我用另一个主键更改了查询中的id\u invoices
,该主键是VARCHAR,但没有标记为unique或其他什么
原因就在我之前,我有一个糟糕的设计,将发票
插入数据库,然后紧接着一个查询,询问发票
的自动递增PK是否用作外键
为了有效地使用批量插入,我需要访问几乎所有数据的唯一标识符,而不依赖于自动递增的“香草”INT PK。我通过如上所述的操作完成了这一点,并添加了用作外键的附加列,等等
我的插入速度现在非常快,但是现在查询需要7秒以上的时间
重申一下,之前我使用的是香草自动增量int作为主键。将外键切换到varchar真的会破坏性能吗
我的下一步似乎是恢复到int-id,但不允许MySQL在插入时自动递增,而是手动创建这些int索引,这样我仍然可以使用批量插入。从查询的角度来看,这不重要。。。应该吗
任何帮助都将不胜感激
Dane好的,首先您需要使用EXPLAIN来确定查询计划中发生了什么,以查看其他可能发生了什么变化 其次,VARCHAR列的匹配速度比INT列慢,尽管通常情况下它只是一个常数增加(例如k*O(n)vs O(n),其中k与n无关)。。。。除非两个表上的字符集不同。当MySQL试图匹配两个不同的字符集时,这就成了一个大问题。谁知道为什么,只是太慢了 第三,你的插页真的那么慢以至于需要大规模的重新设计吗?你的问题不清楚你在做什么,但很难看出随机插入的性能如何对你的工作负载造成如此大的影响,以至于你需要创建一个非常不标准的表结构,这使得其他一切都变得更加困难和缓慢
最后,是关于批量插入的最后一个问题——如果您预先创建了行,插入将不起作用(除非您对重复键执行某些操作)。但是对于这类事情,我总是尽量坚持使用int-id,除非有很好的理由不这样做。每个查询优化都应该从
EXPLAIN
开始