如何通过两个表中超过 750,000 条记录的两个表的联合来优化 mysql 查询?

Posted

技术标签:

【中文标题】如何通过两个表中超过 750,000 条记录的两个表的联合来优化 mysql 查询?【英文标题】:How to optimize mysql query with union of two tables having more than 750,000 records in both tables? 【发布时间】:2020-03-05 11:13:43 【问题描述】:

我有两张桌子propeties_1properties_2。 表propeties_1 有350,000 条记录,而表propeties_2 有400,000 条记录。

我使用如下查询:

Select union_table.* FROM
(
    (select col1 as c1, col2 as c2, col3 as c3 from `propeties_1` where status='A')
    union
    (select colm1 as c1, colm2 as c2, colm3 as c3 from `propeties_2` where status='A')
) as union_table 
limit 12 offset 0 order by c1;

此查询的执行时间过长。

如何优化这个查询?

【问题讨论】:

您希望每个表的结果中有多少行 @Nick 13,但谁在数;-) @HarpalSingh 请在发布前测试所有代码。 @RiggsFolly,我一次需要 12 条记录,但结果应该来自表的联合 @HarpalSingh 有多个因素在优化中发挥作用。我建议通过此链接更好地理解。 ***.com/questions/60015018/laravel-use-mysql-indexing/… 【参考方案1】:

如果您在数据库中将propeties_1.statuspropeties_2.status 标记为INDEX,则可以大大优化您的查询。

您可以使用以下说明轻松创建它:

CREATE UNIQUE INDEX index_status1 on propeties_1(status);
CREATE UNIQUE INDEX index_status2 on propeties_2(status);

索引是数据库搜索引擎可以用来加速数据检索的特殊查找表。简单地说,索引是指向表中数据的指针。数据库中的索引与书后的索引非常相似。

【讨论】:

你试过使用UNION ALL子句吗? 我严重怀疑status 是不是UNIQUE??【参考方案2】:

这是一个简单的技巧——将ORDER BYLIMIT 添加到内部查询中。这里有更多讨论,包括如何处理OFFSET

http://mysql.rjweb.org/doc.php/pagination#pagination_and_union

并且有这些复合索引:

propeties_1:  INDEX(status, col1)
propeties_2:  INDEX(status, colm1)

【讨论】:

以上是关于如何通过两个表中超过 750,000 条记录的两个表的联合来优化 mysql 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较两个数据表并使用多个线程更新第一个数据表?

从一个连接到另一个表 SQL 的表中删除记录

如何验证两个查询是不是包含完全相同的数据

致命错误:在 XAMPP 中超过了 30 秒的最大执行时间

删除 NSDictionaries 中超过 100.000 公里的键和值

mysql force index 优化案例