Mysql 多(1-n)关系表的搜索
我学到了一个艰难的方法,当我需要使序列化数据可搜索时,我不应该将其存储在表中 因此,我制作了3个表作为基础&两个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
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中也是一个坏主意。