【问题标题】:Extremely Slow Nested mySQL Query非常慢的嵌套 mySQL 查询
【发布时间】:2017-07-20 02:32:31
【问题描述】:

所以,我刚刚创建了一个新的 mySQL 数据库,其中包含两个主表 bigTable[600,000 行] 和 lilTable[8000 行]。有一个字段 blId 链接表,该字段已在 bigTable 中建立索引。

我想从 bigTable 中选择所有与 lilTable 中符合特定条件的任何条目共享 blId 的条目,但我不需要该表中的任何其他信息,因此连接似乎过多。

事不宜迟,这是我非常慢的查询:

SELECT * FROM testdb.bigTable where blId in 
(SELECT blId FROM certtest.lilTable WHERE color LIKE 'blue'); 

这需要大约 52 秒才能在我的计算机上运行,​​当内部查询返回 0 个结果时仍然需要 50 秒!相反,如果我单独运行内部查询并手动创建一个列表我代替子查询的可接受 blId 的运行时间不到十分之一秒。蓝色的火焰中发生了什么?

编辑:所以我找到了一种加快速度的方法,将其包装在另一个冗余的 select 语句中? (将查询时间缩短到 0.25 秒)如果有人能解释这种行为,将不胜感激。

SELECT * FROM testdb.bigTable where blId in 
(SELECT * FROM 
  (SELECT blId FROM certtest.lilTable WHERE color LIKE 'blue') AS why
); 

【问题讨论】:

  • sql中一定要使用LIKE吗?换成color='blue'会不会更快?请包括表结构。
  • 您在表格上定义了索引吗?桌子有多大?为什么要使用赞?

标签: mysql sql


【解决方案1】:

尝试改用exists

SELECT bt.*
FROM testdb.bigTable bt
WHERE EXISTS (SELECT 1
              FROM certtest.lilTable lt
              WHERE lt.color LIKE 'blue' AND bt.blID = lt.blId
             ); 

出于此查询的目的,您需要lilTable(blId, color) 上的索引。

【讨论】:

  • 还是基本一样的速度。
  • @CarlShiles 。 . .你有指定的索引吗?
  • 我有,但是我没有将它包含在示例中,因为在将表达式嵌套在附加选择中时,索引显然不是问题,可以将其速度提高 100 倍。我正在寻找能够解释这种行为的具有 mySQL 知识的人。
猜你喜欢
  • 2023-04-07
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多