【问题标题】:How to join two large tables with different strings如何用不同的字符串连接两个大表
【发布时间】:2015-04-29 18:43:18
【问题描述】:

我有两张桌子

table1
customer_id 
101
102
103 

和表2

customer_id country_id 
  AO-101      1
  AO-102      2    
  AO-103      3

这两个表都是非常大的表,我使用CONCAT(table1.customer_id) 与 table2 连接

上面所说的所有字段都是索引字段

加入他们并获得国家 1 的所有客户需要很多时间

谁能帮帮我?

【问题讨论】:

  • 简单。规范您的设计。如果一个表中customer_id是102,那么另一个表中也应该是102。
  • 同意@Strawberry,一致性很重要。

标签: php mysql sql indexing


【解决方案1】:

你可以试试这个伙伴:

SELECT * FROM table1  
JOIN table2 ON CONCAT('AO-', table1.customer_id) = table2.customer_id  
WHERE table2.country_id = 1;  

或者这个:

SELECT * FROM table2
JOIN (
    SELECT CONCAT('AO-', customer_id) AS in_customer_id, table1.* FROM table1
) AS table1 ON table1.in_customer_id = table2.customer_id
WHERE table2.country_id = 1;

【讨论】:

  • 这(与迄今为止提供的所有其他“答案”一样)不能使用索引,因此尽管支持的数量很多,但它仍然会非常缓慢。
  • 我想可能是因为两个表中记录的设计和实现。恕我直言
【解决方案2】:

我相信您遇到的问题是如何存储索引。

理解这一点的方法是从字面上将位于表 NEXT 的 PHYSICAL 索引视为查找。

如果您执行"create index index_1 on table1(column_1)" 之类的操作,它的作用是将其存储在表旁边,并且在您运行引用该表的查询之前,DBMS 会查看表和您的查询并确定最佳方法根据索引、表大小等查询表。

现在,索引将确切的值作为字段存储在确切的 DATATYPE 中,除非您将索引转换为不同的数据类型。

现在您将一个整数字段连接到一个字符字段,并且在那里,您不会从索引中获得相同的性能,因为您不能纯粹使用索引 - 它必须即时翻译,可以这么说。

所以我要做的就是输入如下内容:

create index on table2(cast(replace(customer_id,'AO-','') as integer));

这应该存储一个整数值作为 INDEX,因此当加入整数主键时,索引应该可以正常运行。

另外,为什么不直接存储相同的整数值而不是添加这个“AO-”呢?

【讨论】:

    【解决方案3】:

    mysql 使用CONCAT() 连接字符串

    所以我们使用以下查询:

    ON tableTwo.query = concat('category_id=',tableOne.category_id)
    

    希望对你有所帮助。

    【讨论】:

    • 我不明白你的答案,请你再补充一点解释我需要得到 country_id = 1 的所有 customer_id
    【解决方案4】:

    你可以这样写一个子查询:

    SELECT * FROM table1 JOIN 
        (SELECT SUBSTRING_INDEX(customer_id, '-', -1) AS customer_id, country_id
                FROM table2) t2 USING customer_id;
    

    我没试过,不过你也可以直接加入:

    ON SUBSTRING_INDEX(table2.customer_id, '-', -1) = table1.customer_id
    

    【讨论】:

      【解决方案5】:

      试试这个代码,它的工作原理。

      select * from table4 t4, table3 t3 where t4.cus_id in (CONCAT('A0-', t3.cus_id)) && t4.country=1 ;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-03
        • 2011-11-04
        • 2022-11-16
        • 1970-01-01
        相关资源
        最近更新 更多