Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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_Sql_Database_Relational Database - Fatal编程技术网

MySQL:连接的表的两个字段都需要索引吗?

MySQL:连接的表的两个字段都需要索引吗?,mysql,sql,database,relational-database,Mysql,Sql,Database,Relational Database,当我执行这样的SQL时 SELECT * FROM table_foo JOIN table_bar ON table_foo.foo_id = table_bar.bar_id 我是否需要在table_foo.foo_id上建立索引 还是MySQL在table\u foo.foo\u id和table\u bar.bar\u id上都使用索引 EXPLAIN的结果如下 此查询有多个可能的执行计划: SELECT f.*, b.* FROM table_foo f JOI

当我执行这样的SQL时

SELECT * 
  FROM table_foo 
  JOIN table_bar
    ON table_foo.foo_id = table_bar.bar_id
我是否需要在
table_foo.foo_id
上建立索引

还是MySQL在
table\u foo.foo\u id
table\u bar.bar\u id
上都使用索引

EXPLAIN
的结果如下


此查询有多个可能的执行计划:

SELECT f.*, b.* 
FROM table_foo f JOIN
     table_bar b
     ON f.foo_id = b.bar_id;
以下是一些例子:

  • 您希望避免(大概)的是一个嵌套的循环联接,它逐行循环一个表,然后针对每一行循环第二个表
  • 扫描
    foo
    并使用
    表格栏(bar\u id)
    上的索引在
    栏中查找每个值。从
    栏中的行id
    索引中,获取每个匹配行的相关列
  • 扫描
    ,使用
    表foo(foo\u id)
    上的索引在
    foo
    中查找每个值。从
    foo
    索引中的行id中,获取每个匹配行的相关列
  • 使用合并联接扫描两个索引,并在每个表中查找关联的行
  • 这就省去了其他选项,比如通常不使用索引的hash join


    因此,可以使用一个或两个索引,这取决于优化器实现的算法。也就是说,一个索引通常足以获得您想要的性能。但是,如果你在两个表上都有索引,你就可以给优化器更多的选择。

    为什么不在table_foo上添加索引,看看MySQL是否喜欢。这两个表都需要。.当然,Salman A,但这两个表实际上很大(数百万行),添加索引需要时间。所以我想确定我需要什么指标,“需要”是什么意思?查询时不需要索引。PS请通过编辑澄清,而不是评论。PS谢谢。从其他文本中转述或引用。给出你所需要的&把它和你的问题联系起来。仅将图像用于不能表示为文本或扩充文本的内容。无法搜索或剪切粘贴图像。包括图例/图例和说明以及图片。@Taichi答案是“视情况而定”。我相信您的实际查询将有一个WHERE子句,可能还有一个ORDERBY,如果选择*,则选择a、b、c。在创建索引时,所有这些都很重要。