2013-02-26 63 views
0

我有2个表,我需要加入他们。不幸的是,我没有我可以使用的ID,唯一的标准是一些varchar列。这是“对”的一部分加盟:MySQL:如何加速连接?

join sales_flat_order_address sfoa on  
    concat(lower(trim(sfoa.firstname)), lower(trim(sfoa.lastname))) = concat(lower(trim(so.firstname)), lower(trim(so.lastname))) 

我知道,这是不是最快的方法,但有没有办法spped这件事多一点?或者,也许我现在不能想到一个解决方法?

谢谢!

+0

这将是当你的表变得更大更慢,因为它会执行'由于不使用'INDEX'全表scan'。我唯一的建议是规范你的表格。 – 2013-02-26 15:32:35

+0

您的条件和数据非常专业化,它使我们很难知道可能存在哪些其他选项。这不是一个非常好的数据库设计。 – crush 2013-02-26 15:33:55

+0

执行这样的功能本质上是潜在的性能拖延。建议改变表格以在每个表格上包含索引ID字段以及相应的主键/外键,相应地改变连接,应该在很长时间内产生显着的性能提升和更好的可扩展性。 – 2013-02-26 15:34:23

回答

1

您可以尝试使用此:

ON trim(sfoa.firstname) = trim(so.firstname) 
    AND trim(sfoa.lastname) = trim(so.lastname) 
当然

,你可以尝试两个表中的索引firstnamelastname

0

至少,你应该建立在名字和姓氏两个表中的索引。另外,对你的查询运行解释。这可以告诉你效率低下。

2

索引名字和姓氏列将是一个开始。

首先,虽然我会跑在它前面解释你的查询,看看是否有您可能已经拥有并认为正在使用的实际可能没有正在使用的任何索引。

其次,入世对VARCHAR永远不会是“超级”比较快加入的例如一个int。

http://dev.mysql.com/doc/refman/5.5/en/explain.html

1

您可以添加一个“和”姓和名之间,以避免CONCAT。你也可以在这些列上使用索引(名字和姓氏),以加快速度(特别是如果你使用比较的话)。

join sales_flat_order_address sfoa on  
trim(sfoa.firstname) = trim(so.firstname) and trim(sfoa.lastname) = trim(so.lastname) 
1

该查询基本上是做餐桌上的交叉连接,然后与条件匹配。要解决此问题,您可以:

  1. 向每个称为全名的表中添加一个新列。
  2. 给出的是这样的值: concat(lower(trim(firstname)), lower(trim(lastname)))
  3. 构建该值的索引。

其实,你可以做到这一点只在表中的一个,和MySQL将使用索引进行比较(还需要在第一个表进行全表扫描。

你也可以有一个“全名“表,并使用这些表中的每一个的外键来获得全名

独立索引名称不会影响查询名称在函数内部被访问,这通常会关闭能力。使用索引