加入3000多张桌子

时间:2014-07-25 16:11:01

标签: mysql sql

好的,这里很奇怪

我有一个客户数据数据库。我的客户是拥有自己客户的企业。

我有3000个表(每个业务一个),每个表有几千个电子邮件地址。每个表都相同,保存名称。

我需要找到一种方法来查找电子邮件在业务之间交叉的位置(即出现在多个表中)以及它们所在的表的名称。

我已经尝试将所有条目和表名整理到一个表中并使用"组"但是如果没有我们的服务器过度使用,那么数据量太高而无法运行...

有没有人建议如何在不运行3000套连接的情况下完成此操作?

另外,我无法改变AT ALL的数据结构。

由于

编辑:回应那些"有帮助的"重组评论,不是我的数据库,不是我的系统,我几个月前才开始分析数据

2 个答案:

答案 0 :(得分:3)

具有相同结构的多个表几乎没有意义,只需business字段即可修复此结构。如果可能的话你应该修复结构。如果它被强加给你并且你无法改变它,你仍然可以使用它。

从每个表UNION ALL中选择不同的电子邮件和表名,或将其拉入新表,然后使用GROUP BYHAVING查找包含多个表的电子邮件。

SELECT email
FROM Combined_Table
GROUP BY email
HAVING COUNT(sourc_table) > 1

答案 1 :(得分:0)

因此,您说您无法更改数据结构,但您可以提供兼容的升级。

  1. 提供一个新的超级表:

     CREATE TABLE business_email (
         id_business INT(10) NOT NULL,
         email VARCHAR(255) NOT NULL UNIQUE,
         PRIMARY KEY id_business, email
     ) ENGINE = MYISAM;
    
  2. Myisam引擎让您不必担心交易。

    1. 为每个商家信息表添加一个触发器,将电子邮件复制到新信息中:

      DELIMITER \\
      
      CREATE TRIGGER TRG_COPY_EMAIL_BUSINESS1 AFTER INSERT OR UPDATE ON business1 FOR EACH ROW 
      BEGIN
          INSERT INTO `business_email` (`id_business`, `email`) VALUES (NEW.`id_business`, NEW.`email`) ON DUPLICATE KEY UPDATE `id_business`=NEW.`id_business`;
      END;
      \\
      
      DELIMITER ;
      
    2. 您的问题是每当创建新表时动态添加它。它不应该是一个问题,因为你的应用程序代码中已经有了动态DDL。

      1. 将所有现有数据复制到新表:

        INSERT INTO `business_email` (`id_business`, `email`) 
        SELECT email FROM business1
        UNION
        SELECT email FROM business2
        ...
        ;
        
        COMMIT;
        
      2. 继续查询新的business_email表,这应该大大简化:

        SELECT `id_business` FROM `business_email` 
        WHERE
        GROUP BY `email`
        HAVING COUNT(`email`) > 2;
        
      3. 此查询应易于处理。如果没有,请详细说明问题,因为我认为正确索引的表格应该是一个问题,即使对于数百万行也是如此(自从我们谈论电子邮件以来,我不相信这种情况)

        此解决方案的优势在于您可以始终保持最新状态,而不会改变应用程序的工作方式。您只需添加另一个图层即可提供额外的业务价值。