的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) => {
...
我有一张约有1,000,000条记录的表。我写了一个选择来完成记录。
select * from tableA where trackingNo in (?)
我将通过数组参数发送trackingNo。 traceNo的数量大约为20000。这意味着数组的长度大约为20000。
我将索引设置为trackingNo列。 (trackingNo列是varchar类型,不是唯一的,可以为null,空白和所有可能的值)
问题是,我发现获取结果大约需要5分钟! 5分钟是指纯后端sql处理时间。我认为在1,000,000条记录中匹配20000条记录太慢了。您对in的选择有什么建议吗?
解释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
最佳答案
您可以考虑使用要匹配的跟踪号填充表格。然后,您可以使用内部联接代替当前的WHERE IN
方法:
SELECT *
FROM tableA a
INNER JOIN tbl b
ON a.trackingNo = b.trackingNo;
这样做的好处是,您可以在
tbl
列上为新的trackingNo
表建立索引,以使联接查找变得非常快。假定
tbl
将只有一列trackingNo
,其中包含您需要考虑的20K +值。