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

标签 mysql sql database performance join

我正在尝试在多个表中进行搜索。我在设计数据库时遵循规范化规则。我在这个 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/

相关文章:

Java Spring - 从文件执行 MySQL 查询

sql - 当每行包含下一行的 id 时,对 SQL 请求进行排序

mysql - on 子句中的未知列,即使该列存在

c# - 在 C# Windows 窗体中动态创建控件

java - JPA @ElementCollection 如何查询?

MySQL:回滚时间更长?

php - 并发访问PHP+MySQL出现ID生成问题

mysql - mysql 数据版本控制系统的最佳实践

php - 验证后获取用户的用户名,并将其存储到 mySQL 数据库中

mysql - 如何实现 "complex"INSERT 查询来检索调用其他查询的值?