Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么更改为另一个主键索引会降低此查询的性能?_Mysql - Fatal编程技术网

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
开始