如何使用不同的字符串连接两个大表

时间:2015-02-27 06:01:14

标签: php mysql sql indexing

我有两张桌子

table1
customer_id 
101
102
103 

和table2

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

这两个表都是非常大的表我使用CONCAT(table1.customer_id)来加入table2

上述所有字段均为索引字段

加入他们并获得国家1的所有客户需要花费大量时间

有人可以帮我吗?

5 个答案:

答案 0 :(得分:2)

你可以尝试这个伴侣:

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;

答案 1 :(得分:1)

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

理解这一点的方法是从字面上考虑一个物理索引,该索引位于表格的NEXT附近。

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

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

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

所以我要做的就是输入:

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

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

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

答案 2 :(得分:0)

mysql使用CONCAT()来连接字符串

所以我们使用以下查询:

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

希望这对你有所帮助。

答案 3 :(得分:0)

您可以编写如下子查询:

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

答案 4 :(得分:0)

尝试使用此代码。

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