mysql在多个连接表中搜索(7个表有6个连接)

时间:2015-08-11 22:31:48

标签: mysql sql database performance join

我正在尝试搜索多个表格。我在设计数据库时遵循了规范化规则。我在此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秒。 每个表中的记录数为:

  • mdf_room:538
  • tel_subscriber:798019
  • tel_subscriber_has_port:790989
  • port:797174
  • isp:22
  • isp_has_port:810676
  • 合同:25

我试图在here中解释查询。

我可以做些什么来适时搜索我想要的信息?

2 个答案:

答案 0 :(得分:0)

在查询中使用EXPLAIN来了解MySQL的查询计划。创建适当的索引以防止表扫描。以下是一些供您参考的链接:

Understanding the Query Execution Plan

MySQL Explain Explained

如果您发布EXPLAIN查询的结果,则可能会获得更具体的建议。

答案 1 :(得分:0)

尝试使用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方式也很有用。