我正在尝试搜索多个表格。我在设计数据库时遵循了规范化规则。我在此schema中解释了7个表。
我构建了一个视图,从这些表中获取有趣的列。
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个连接。 当我尝试在此视图中搜索任何因素(1个或多个标准)时,它太慢(超过10分钟没有结果)。 当我尝试在每个表中搜索时,我得到的结果最长时间为5秒。 每个表中的记录数为:
我试图在here中解释查询。
我可以做些什么来适时搜索我想要的信息?
答案 0 :(得分:0)
在查询中使用EXPLAIN
来了解MySQL的查询计划。创建适当的索引以防止表扫描。以下是一些供您参考的链接:
Understanding the Query Execution Plan
如果您发布EXPLAIN
查询的结果,则可能会获得更具体的建议。
答案 1 :(得分:0)
问题是你要加入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
方式也很有用。