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

小编典典

这取决于您的搜索方式。

如果您这样搜索:

/* 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。

2020-05-17

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值