MySQL中的查询优化
例如,对于一个比查询2更大的数据库来说,查询1是稍微优化了一点,还是我只是用一个额外的WHERE子句加倍了工作 问题1:MySQL中的查询优化,mysql,query-optimization,Mysql,Query Optimization,例如,对于一个比查询2更大的数据库来说,查询1是稍微优化了一点,还是我只是用一个额外的WHERE子句加倍了工作 问题1: SELECT sample_data FROM table1 INNER JOIN table2 ON table1.key = table2.key WHERE table1.key = table2.key; 问题2: SELECT sample_data FROM table1 INNER JOIN table2 ON table1.key = table2.key
SELECT sample_data
FROM table1 INNER JOIN table2 ON table1.key = table2.key
WHERE table1.key = table2.key;
问题2:
SELECT sample_data
FROM table1 INNER JOIN table2 ON table1.key = table2.key;
因为我读到这篇文章说在连接子句中使用过滤器可以提高性能
查询1是否比查询2更优化(例如,对于更大的数据库)
不,它没有得到更多优化。查询2是处理连接的正确方法。Query1也做了同样的事情,但是在MySQL服务器软件找出如何满足您的查询时,需要删除额外的措辞
关于在联接中筛选两个表的建议与联接的ON条件无关。他们的例子说要做到这一点
SELECT whatever, whatever
FROM table1
JOIN table2 ON table2.table1_id = table1.table1_id
WHERE table1.date >= '2021-01-01'
AND table2.date >= '2021-01-01' /* THIS LINE IS WHAT THEY SUGGEST */
从2015年开始,他们的建议是从两个表中过滤非连接属性。如果查询速度不够快,建议您使用它来优化查询。根据我的经验,这不是一个很好的建议。忽略它,至少现在是这样。最近的MySQL版本已经变得更加高效
让我补充一点。SQL是一种所谓的“声明性”语言。你声明了你想要什么,MySQL服务器就会为你找到它。SQL软件在这方面越来越擅长;请记住,MySQL现在已经有四分之一世纪的历史了。在这段时间里,它的程序员一直在不断地让它更聪明地弄明白如何获取东西。你可能比不上它。但当表变得非常大时,可能需要添加索引
其他语言是“程序化”的:作为程序员,您可以详细说明获取所需内容的过程。SQL不需要这样做。我想这样说:
- 在上指定表的关联方式
用于过滤其中
JOIN
(又称internaljoin
)将置于
和其中
相同的位置。也就是说,没有性能差异。查询1不必要地指定了两次“关系”
此外,MySQL的优化器足够聪明,可以实现两列值相同的情况。比如说,
SELECT ...
FROM a
JOIN bb ON a.foo = bb.foo
WHERE a.foo = 123
如果优化器决定从过滤器bb.foo=123
开始更为优化,它将这样做。注意:这与您展示的示例不同;它连接一件事(id
),但过滤另一件事(date
)。那里的两个查询不相等
左连接
,必须对上的和
中的进行不同的处理。(但这是另一个主题。)我认为这里的问题是,您的查询1没有意义,可能需要检查它并使用另一个example@Nae这是从这篇文章