当前位置: 首页 > 面试题库 >

如何为MySQL中的多对多连接正确索引链接表?

戴霖
2023-03-14
问题内容

可以说我在表“ table1”和“ table2”之间有一个简单的多对多表,该表由两个int字段组成:“ table1-id”和“
table2-id”。我应该如何索引此链接表?

我曾经只是制作一个复合主索引(table1-id,table2-id),但是我读到,如果您更改查询中字段的顺序,则该索引可能不起作用。那么,最佳解决方案是什么-
为每个字段创建独立索引而不使用主索引?

谢谢。


问题答案:

这取决于您的搜索方式。

如果您这样搜索:

/* Given a value from table1, find all related values from table2 */
SELECT *
FROM table1 t1
JOIN table_table tt ON (tt.table_1 = t1.id)
JOIN table2 t2 ON (t2.id = tt.table_2)
WHERE t1.id = @id

那么您需要:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)

在这种情况下,table1将被引入,NESTED LOOPS并且只有在table1首先建立索引时,您的索引才可用。

如果您这样搜索:

/* Given a value from table2, find all related values from table1 */
SELECT *
FROM table2 t2
JOIN table_table tt ON (tt.table_2 = t2.id)
JOIN table1 t1 ON (t1.id = tt.table_1)
WHERE t2.id = @id

那么您需要:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)

由于上述原因。

您在这里不需要独立的索引。复合索引可以在可以使用第一列的纯索引的任何地方使用。如果使用独立索引,则将无法有效搜索这两个值:

/* Check if relationship exists between two given values */
SELECT 1
FROM table_table
WHERE table_1 = @id1
  AND table_2 = @id2

对于这样的查询,两列都至少需要一个索引。

为第二个字段添加一个附加索引从不坏:

ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
CREATE INDEX ix_table2 ON table_table (table_2)

主键将用于搜索on both values和基于值的搜索table_1,附加索引将用于基于值的搜索table_2



 类似资料:
  • 我尝试通过应用服务器Glassfish和JPA连接到mysql数据库。 我的persistence.xml如下所示: 有什么问题?

  • 该查询占用了tmp目录中的3GB+并最终超时。我这里少了点什么,怎样才能提高效率?我在这里的目标只是添加到现有查询中,以便从额外的表(j25_mt_cfvalues)中获取值。 : j25_mt_cats模式:

  • 问题内容: 假设我在MySQL数据库中有两个表。 表格1: 表2: 从数据库中选择行时,是否有任何方法可以将第二个表中的行作为列连接到第一个表中?目前我正在使用。 输出: 目前,我正在PHP脚本中对此进行排序,以将其排序为一个数组。这很痛苦,因为我必须查看ID,看看它们是否相同,然后进行相应的排序。我觉得有一种方法可以在MySQL中正确执行此操作,而不必在PHP中将其分类为数组。每个ID在第二个表

  • 我试图从我的链接表sfees中获取数据,它由来自学生表的学生id和来自M_费用表的MFEEID组成。我的模型是: M_fees: 现在,我如何检索特定学生的学费(类型和金额)?我在控制器中使用了以下功能: 但它似乎不起作用。 有人能帮我吗?

  • 问题内容: 我有两个桌子和。表具有字段和其他几个字段。表具有3个字段: 是固定的值枚举。例如,它可以是,或。 我需要进行查询,其结果将是4列: ,对,对,对 如果不存在用于相应值在表然后NULL值应在相应的列中显示。 例: 结果应该是: 我尝试了3次左联接表,但无法弄清楚如何排列输出 问题答案: 您需要使用多个: 这是一个示例:SQL Fiddle。

  • 问题内容: 我从来没有做过这样的PHP / MYSQL技巧来加入多表。请具有该领域经验的人员帮助: TICKETS 表中的字段: 表 RECEPTS中的 字段: 表 PAYMENTS中的 字段: 表 CUSTOMERS中的 字段: 表之间的关系很容易理解: 我希望达到的最终结果: 我试图做这样的事情,但在某个地方出错: 问题答案: 您应该可以使用以下方法获得结果: 参见带有演示的SQL Fiddl