Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中的查询优化_Mysql_Query Optimization - Fatal编程技术网

MySQL中的查询优化

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

例如,对于一个比查询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;
因为我读到这篇文章说在连接子句中使用过滤器可以提高性能

查询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不需要这样做。

我想这样说:

  • 在上指定表的关联方式
  • 其中
    用于过滤
这使得阅读查询的人很容易理解它

实际上(对于MySQL),
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这是从这篇文章