Mysql 关于select的sql性能。。。在里面

Mysql 关于select的sql性能。。。在里面,mysql,sql,Mysql,Sql,Mysql 5.7.21 我使用池连接数据库并运行SQL let mysql = require('mysql'); let pool = mysql.createPool(db); pool.getConnection((err, conn) => { if(err){ ... }else{ console.log('allConnections:' + pool._allConnections.length); l

Mysql 5.7.21

我使用池连接数据库并运行SQL

let mysql = require('mysql');
let pool = mysql.createPool(db);
pool.getConnection((err, conn) => {
      if(err){
        ...
      }else{
        console.log('allConnections:' + pool._allConnections.length);
        let q = conn.query(sql, val, (err, rows,fields) => {
        ...
我有一个大约有1000000条记录的表。我写了一个选择来记录

select * from tableA where trackingNo in (?)
我将通过数组参数发送trackingNo。trackingNo的数量约为20000。这意味着阵列的长度约为20000

我把索引改为trackingNo列。(trackingNo列为varchar类型,不唯一,可以为null、空和所有可能的值)

问题是,我发现获得结果大约需要5分钟!5分钟在这里意味着纯后端sql处理时间。我认为在1000000条记录中匹配20000条记录太慢了。你对选择有什么建议吗。。在哪

解释SQL:

id  select_type table   partitions  type    possible_keys          key    key_len   ref   rows   filtered   Extra
1   SIMPLE      tableA  null        ALL     table_tracking_no_idx  null   null      null  999507    50      Using where

<>你可以考虑用你想要匹配的跟踪号码填充一个表。然后,您可以使用内部联接,而不是当前的
,其中在
方法中:

SELECT *
FROM tableA a
INNER JOIN tbl b
    ON a.trackingNo = b.trackingNo;
这样做的好处是,您可以在
trackingNo
列上索引新的
tbl
表,以使联接查找非常快


这假定 TBL将有一个列“代码> TrackNo.< /代码>,其中包含需要考虑的20K+值。

< P>可以考虑用要匹配的跟踪号填充一个表。然后,您可以使用内部联接,而不是当前的
,其中在
方法中:

SELECT *
FROM tableA a
INNER JOIN tbl b
    ON a.trackingNo = b.trackingNo;
这样做的好处是,您可以在
trackingNo
列上索引新的
tbl
表,以使联接查找非常快


这假定 TBL将有一个列“代码> TraveNo./CODE”,其中包含需要考虑的20K+值。

列表中创建了一个由常量组成的二进制搜索树。正如报告中所述:

如果所有值都是常量,则将根据expr的类型对其进行求值并进行排序。然后使用二进制搜索完成对项目的搜索。这意味着,如果IN值列表完全由常量组成,则IN非常快

一般来说,使用常量创建一个单独的表并不能提高性能

我想可能有一些类型兼容性方面的微妙问题——比如排序规则——干扰了这个过程


这种类型的查询可能需要完整的表扫描。如果行很宽,那么扫描和返回数据的组合可能是性能的原因。我同意五分钟是很长的时间,但这可能完全是由于应用程序/GUI和数据库之间的网络连接。

MySQL为由常量组成的列表中的
创建了一个二进制搜索树。正如报告中所述:

如果所有值都是常量,则将根据expr的类型对其进行求值并进行排序。然后使用二进制搜索完成对项目的搜索。这意味着,如果IN值列表完全由常量组成,则IN非常快

一般来说,使用常量创建一个单独的表并不能提高性能

我想可能有一些类型兼容性方面的微妙问题——比如排序规则——干扰了这个过程


这种类型的查询可能需要完整的表扫描。如果行很宽,那么扫描和返回数据的组合可能是性能的原因。我同意五分钟是很长的时间,但这可能完全是由于应用程序/GUI和数据库之间的网络连接。

表定义会有所帮助,编辑你的问题。你有关于trackingNo的索引吗?trackingNo是连续的吗?trackingNo是唯一的吗?你有没有检查该查询的
EXPLAIN
的输出?不是对你的特定查询的建议,但是使用
EXPLAIN SELECT
通常可以解释问题。表定义有助于编辑您的问题。您有关于trackingNo的索引吗?trackingNo是连续的吗?trackingNo是唯一的吗?您是否检查了该查询的
EXPLAIN
输出?不是对特定查询的建议,但使用
EXPLAIN SELECT
通常可以解释问题@thx戈登。5分钟在这里意味着纯后端sql处理时间。从sql执行的开始到结束。我不确定这是由排序问题引起的。因为列是varchar类型。并且数据包含null、blank和其他可能的值,例如null、、‘SD231’、‘2324423’等。显然,该列不是唯一的。我为它创建了ASC索引。是数组参数问题还是其他Mysql设置技巧?@thx Gordon。5分钟在这里意味着纯后端sql处理时间。从sql执行的开始到结束。我不确定这是由排序问题引起的。因为列是varchar类型。并且数据包含null、blank和其他可能的值,例如null、、‘SD231’、‘2324423’等。显然,该列不是唯一的。我为它创建了ASC索引。是数组参数问题还是其他Mysql设置技巧?Thx@Tim,让我试试。Thx@Tim,我已经试过了。是的,在使用临时表之后,性能得到了高度提升。再来一次。thx@Tim,让我试试。thx@Tim,我已经试过了。是的,在使用临时表之后,性能得到了高度提升。又是thx。