如何通过两个表中超过 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_1
和properties_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.status
和propeties_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 BY
和LIMIT
添加到内部查询中。这里有更多讨论,包括如何处理OFFSET
:
http://mysql.rjweb.org/doc.php/pagination#pagination_and_union
并且有这些复合索引:
propeties_1: INDEX(status, col1)
propeties_2: INDEX(status, colm1)
【讨论】:
以上是关于如何通过两个表中超过 750,000 条记录的两个表的联合来优化 mysql 查询?的主要内容,如果未能解决你的问题,请参考以下文章