两个表之间的查询慢

Posted

技术标签:

【中文标题】两个表之间的查询慢【英文标题】:Query Slowness Between Two Tables 【发布时间】:2021-04-17 17:18:28 【问题描述】:

如果在我的 "table1""table2" 表中存在与 "parent_id" 的值匹配的结果,我想获取 "table1" 表中的行数。

但是 SQL 查询耗时太长。

table1 中有 100,000 行。

table2 中有 40,000 行。

供您试用的表格数据文件 见:https://pastebin.pl/view/raw/ddf8c467

表结构

CREATE TABLE table1 (id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
parent_id INT(11) UNSIGNED NOT NULL ,
tes1 INT(1) NOT NULL , PRIMARY KEY (id)) ENGINE = MyISAM;

CREATE TABLE table2 (id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
parent_id INT(11) UNSIGNED NOT NULL ,
tes2 INT(1) NOT NULL , PRIMARY KEY (id)) ENGINE = MyISAM;

我使用的 SQL 查询

SELECT     COUNT(A.id) AS total
FROM       table1 A
LEFT JOIN  table2 B ON A.parent_id = B.parent_id
WHERE      B.id IS NOT NULL

【问题讨论】:

在表 B 的 parent_id 上创建索引,如果可能,使用 INNODB 这不是 sql server。标签已移除 您好@BerndBuffen,我根据您的建议应用了以下 SQL 代码并且它有效。非常感谢。索引会有副作用吗? ALTER TABLE table2`添加索引(`parent_id); 用索引 mysql 可以找到上面的。阅读:mariadb.com/kb/en/getting-started-with-indexes 【参考方案1】:

在表 B 上的 parent_id 上创建索引并尽可能使用 INNODB。

你也可以使用内连接

SELECT     COUNT(A.id) AS total
FROM       table1 A
INNER JOIN  table2 B ON A.parent_id = B.parent_id;

【讨论】:

以上是关于两个表之间的查询慢的主要内容,如果未能解决你的问题,请参考以下文章

Mysql某个表有近千万数据,CRUD比较慢,如何优化?

mysql中两个大表之间的连接查询

Oracle SQL 更新基于两个表之间的子查询

使用 sequelize 通过相同两个表之间的单独联结表进行查询

寻找两个表/查询之间的双左连接的改进

两个表之间的查询? [关闭]