我正在尝试在多个表中进行搜索。我在设计数据库时遵循规范化规则。我在这个 schema 中解释了 7 个表.
我构建了一个 View 以从这些表中获取有趣的列。
ALTER ALGORITHM = UNDEFINED DEFINER = `root`@`localhost` SQL SECURITY DEFINER VIEW `port_data_view` AS
SELECT `s`.`tel_subscriber_number` AS `phone`
,`s`.`tel_subscriber_name` AS `tel_subscriber_name`
,`thp`.`tel_subscriber_has_port_startdate` AS `Reservation_Date`
,`p`.`port_serialnum` AS `port_number`
,`p`.`port_current_speed` AS `port_speed`
,`p`.`idport` AS `idport`
,`p`.`port_status` AS `port_status`
,`isp`.`isp_en_name` AS `isp_en_name`
,`c`.`contract_enname` AS `contract_enname`
,`mdf`.`mdf_room_arname` AS `mdf_room_arname`
,`mdf`.`idmdf_room` AS `idmdf_room`
,`c`.`idcontract` AS `contract_id`
,`isp`.`idisp` AS `isp_id`
FROM (
(
(
(
(
(
`tel_subscriber` `s` INNER JOIN `tel_subscriber_has_port` `thp` ON (
(
(`s`.`idtel_subscriber` = `thp`.`tel_subscriber_idtel_subscriber`)
AND (`thp`.`tel_subscriber_has_port_status` = 'active')
)
)
) INNER JOIN `port` `p` ON ((`p`.`idport` = `thp`.`port_idport`))
) INNER JOIN `isp_has_port` `ihp` ON (
(
(`p`.`idport` = `ihp`.`port_idport`)
AND (`ihp`.`isp_has_port_status` = 'Active')
)
)
) INNER JOIN `isp` ON ((`ihp`.`isp_idisp` = `isp`.`idisp`))
) INNER JOIN `mdf_room` `mdf` ON ((`mdf`.`idmdf_room` = `p`.`mdf_room_idmdf_room`))
) INNER JOIN `contract` `c` ON ((`c`.`idcontract` = `p`.`contract_idcontract`))
)
如您所见,这些表之间有 7 个连接。 当我尝试在此 View 中搜索任何因素(1 个或多个条件)时,它太慢了(超过 10 分钟没有结果)。 当我尝试在每个表中搜索时,我得到的结果最长时间为 5 秒。 每个表中的记录数为:
- mdf_room: 538
- 电话用户:798019
- tel_subscriber_has_port:790989
- 端口:797174
- 互联网服务提供商:22
- isp_has_port: 810676
- 契约(Contract):25
我试图解释 here 中的查询.
如何在适当的时间搜索到我想要的信息?
最佳答案
尝试使用Join with Subquery First .
问题是您要连接 7 个表(其中 4 个表有大约一百万条记录),这会使 mysql 服务器发疯。
要克服这个问题,请尝试通过加入子查询(包括其中的条件)来加入您想要的有趣数据。
示例:
第一种情况:
SELECT t1.*, t2.*
from table1 t1 join table2 t2 on (t1.id = t2.fkid)
where t2.attr1 = 'foo'
第二种情况:
select t1.*, t2_1.*
from table1 t1 join (select t2.* from table2 t2 where t2.attr1 = 'foo') t2_1
on t1.id = t2_1.fkid
当您有很多连接时,这会很有用。不超过 2 或 3 个连接,传统的join then search
方式也很有用。
关于mysql 在多个连接表中搜索(7 个表,6 个连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31953125/