我有两张桌子
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的所有客户需要花费大量时间
有人可以帮我吗?
答案 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;