Mysql 这两个查询中,我使用哪一个对性能最好?
我有两个问题要做 问题1:Mysql 这两个查询中,我使用哪一个对性能最好?,mysql,performance,Mysql,Performance,我有两个问题要做 问题1: SELECT * FROM table1 where id = 1 UNION ALL SELECT * FROM table2 where id = 5 UNION ALL SELECT * FROM table1 where id = 70 UNION ALL SELECT * FROM table2 where id = 3 UNION ALL SELECT * FROM table1 where id = 90 和问题2: SELECT * FROM tab
SELECT * FROM table1 where id = 1
UNION ALL
SELECT * FROM table2 where id = 5
UNION ALL
SELECT * FROM table1 where id = 70
UNION ALL
SELECT * FROM table2 where id = 3
UNION ALL
SELECT * FROM table1 where id = 90
和问题2:
SELECT * FROM table1 where id IN (1,70,90)
UNION ALL
SELECT * FROM table2 where id IN (5,3)
这两个查询中哪一个更快
如果你的答案是第二个问题
我在许多不同的地方使用过查询1。在这个项目中,差异是如此之大,以至于我会用第二个查询替换everywhere?第二个版本更简洁,应该更快,因为它只需要实际执行两个查询,而第一个版本对每个
id
值执行单独的查询
假设
id
是这两个表中的主键,那么MySQL也可以使用聚集索引更快地查找匹配的记录。典型的计数是多少?总共5行?两张桌子?我认为性能差异是行/表支持第二个(较短)公式的一个因素。在实验中,我得到了大约2倍
因此,如果您有两个表中的100行,那么第二个公式将大大加快速度;速度足够快,值得付出努力
为什么?
- 对于这样简单的查询,解析和优化占据了主导地位
- 对于较新版本的MySQL,两个查询将涉及相同数量的行
- 对于MySQL 5.7.3及更高版本,
都不需要临时表UNION-ALL
输出行的顺序可能不同,这有关系吗?我在许多不同的地方使用过查询1。在该项目中,差异是否如此之大,以至于我会用第二个查询替换everywhere?执行一些不必要的联合不会降低数据库性能,但最佳做法是重构,假设您能够做到这一点。Tim Biegeleisen感谢您的描述,为什么您不执行两个查询并检查哪一个更快?@emix因为我希望在概念上进行探索,而不是在特定的时间进行探索,但这通常取决于您的表架构和其中的数据量。数据库设置也会影响此设置、数据库版本、使用的引擎。有很多因素。因此,我们无法告诉您数据库优化器将如何执行。看看Tim是如何回答的:“应该”、“假设”、“可能”。@emix我使用inodb引擎,id是pk,平均表有300000行。下一次只需在真实数据集上运行查询,并检查并解释优化器做出了哪些决策。