Mysql 多(1-n)关系表的搜索

Mysql 多(1-n)关系表的搜索,mysql,sql,performance,join,Mysql,Sql,Performance,Join,我学到了一个艰难的方法,当我需要使序列化数据可搜索时,我不应该将其存储在表中 因此,我制作了3个表作为基础&两个1-n关系表 因此,如果我想选择一个特定的活动,这里是我得到的查询 SELECT jdc_organizations_activities.id FROM jdc_activity_sector , jdc_activity_type INNER JOIN jdc_organizations_activities ON jdc_activity_type.activityId = j

我学到了一个艰难的方法,当我需要使序列化数据可搜索时,我不应该将其存储在表中

因此,我制作了3个表作为基础&两个1-n关系表

因此,如果我想选择一个特定的活动,这里是我得到的查询

SELECT
jdc_organizations_activities.id
FROM
jdc_activity_sector ,
jdc_activity_type
INNER JOIN jdc_organizations_activities ON jdc_activity_type.activityId = jdc_organizations_activities.id 
AND 
jdc_activity_sector.activityId = jdc_organizations_activities.id
WHERE
jdc_activity_sector.activitySector = 5 AND
jdc_activity_type.activityType = 3
问题:

1-我可以在1-n关系表上添加什么类型的索引,我已经有了(activityId-activitySector)和(activityId-activityType)的唯一组合

2-是否有更好的方法编写查询以获得更好的性能


谢谢大家!

我建议不要在单个查询中混合使用表1中的旧样式
、表2中的新样式
、表1中的内部联接表2…
。您可以使用
表1将表别名为t1
,将长表名缩短为易于记忆的助记符:

select    a.id
from      jdc_organizations_activities a
join      jdc_activity_sector as
on        as.activityId = a.Id
join      jdc_activity_type as at
on        at.activityId = a.Id
where     as.activitySector = 5
          and at.activityType = 3
或者使用
中的
更具可读性:

select    a.id
from      jdc_organizations_activities a
where     a.id in 
          (
          select  activityId 
          from    jdc_activity_sector 
          where   activitySector = 5
          )
          and a.id in 
          (
          select  activityId 
          from    jdc_activity_type 
          where   activityType = 3
          )

我建议不要将表1中的旧样式
、表2中的
和表1中的新样式
、内部联接表2…
混合在一个查询中。您可以使用
表1将表别名为t1
,将长表名缩短为易于记忆的助记符:

select    a.id
from      jdc_organizations_activities a
join      jdc_activity_sector as
on        as.activityId = a.Id
join      jdc_activity_type as at
on        at.activityId = a.Id
where     as.activitySector = 5
          and at.activityType = 3
或者使用
中的
更具可读性:

select    a.id
from      jdc_organizations_activities a
where     a.id in 
          (
          select  activityId 
          from    jdc_activity_sector 
          where   activitySector = 5
          )
          and a.id in 
          (
          select  activityId 
          from    jdc_activity_type 
          where   activityType = 3
          )

我将重新组织查询,以避免使用
符号造成的交叉积

此外,您实际上只使用
扇区
类型
表作为过滤器。所以,先把
活动
表放在首位,然后加入其他表

有人可能会说,;理想情况下,第一个连接应该是最有可能限制结果的连接,在第二个连接中留下最少的工作量。实际上,在生成计划时,sql引擎实际上可以重新安排您的查询,但这种方式确实有助于您思考sql引擎必须付出的努力

最后,每个表上都有索引。实际上,我建议反转索引…
-ActivitySector然后ActivityId
-ActivityType然后是ActivityId

这是因为sql引擎正在处理您的查询。它可以使用WHERE子句并表示“仅包括来自ActivitySector=5的扇区表的记录”,对于类型表也是如此。通过在索引中首先标识扇区和类型,可以更快地完成表的过滤,然后连接所要做的工作就会少得多

SELECT
  [activity].id
FROM
  jdc_organizations_activities    AS [activity]
INNER JOIN
  jdc_activity_sector             AS [sector]
    ON [activity].id = [sector].activityId
INNER JOIN
  jdc_activity_type               AS [type]
    ON [activity].id = [type].activityId
WHERE
  [sector].activitySector = 5
  AND [type].activityType = 3
或者,因为您实际上没有使用活动表的内容

SELECT
  [sector].activityId
FROM
  jdc_activity_sector             AS [sector]
INNER JOIN
  jdc_activity_type               AS [type]
    ON [sector].activityId = [type].activityId
WHERE
  [sector].activitySector = 5
  AND [type].activityType = 3
或者


我将重新组织查询,以避免使用
符号造成的交叉积

此外,您实际上只使用
扇区
类型
表作为过滤器。所以,先把
活动
表放在首位,然后加入其他表

有人可能会说,;理想情况下,第一个连接应该是最有可能限制结果的连接,在第二个连接中留下最少的工作量。实际上,在生成计划时,sql引擎实际上可以重新安排您的查询,但这种方式确实有助于您思考sql引擎必须付出的努力

最后,每个表上都有索引。实际上,我建议反转索引…
-ActivitySector然后ActivityId
-ActivityType然后是ActivityId

这是因为sql引擎正在处理您的查询。它可以使用WHERE子句并表示“仅包括来自ActivitySector=5的扇区表的记录”,对于类型表也是如此。通过在索引中首先标识扇区和类型,可以更快地完成表的过滤,然后连接所要做的工作就会少得多

SELECT
  [activity].id
FROM
  jdc_organizations_activities    AS [activity]
INNER JOIN
  jdc_activity_sector             AS [sector]
    ON [activity].id = [sector].activityId
INNER JOIN
  jdc_activity_type               AS [type]
    ON [activity].id = [type].activityId
WHERE
  [sector].activitySector = 5
  AND [type].activityType = 3
或者,因为您实际上没有使用活动表的内容

SELECT
  [sector].activityId
FROM
  jdc_activity_sector             AS [sector]
INNER JOIN
  jdc_activity_type               AS [type]
    ON [sector].activityId = [type].activityId
WHERE
  [sector].activitySector = 5
  AND [type].activityType = 3
或者


离题,但我建议您坚持使用
JOIN
语法,不要混用较旧的
语法进行连接。离题,但我建议您坚持使用
JOIN
语法,不要混用较旧的
连接语法。老实说,颠倒索引顺序可能会产生更大的差异。+1,但您不应该使用
[]
语法,因为这不适用于mysql,在这种情况下,子查询在mysql中也是一个坏主意。颠倒索引顺序可能会产生更大的差异。+1,但是您不应该使用
[]
语法,因为这不适用于mysql,在这种情况下,子查询在mysql中也是一个坏主意。