在JOIN中使用CONCAT的方法

时间:2010-11-05 10:02:53

标签: sql mysql

我有一个关于在JOIN中使用CONCAT的mysql优化问题。 我有两张桌子:

网页
(id,类型,标题,内容)
1,'正面','欢迎','内容文字'
2,'page','Page 2','更多内容'

路径
(pid,syspath,cleanpath)
98,'前/ 1','/'
99,'page / 2','/ contact'

使用我使用的路径选择内容:

  

SELECT c.title,c.content,u.cleanpath
  来自页面c
  LEFT JOIN路径p ON p.syspath = CONCAT(c.type,'/',c.id);

现在这个查询工作正常,但是很多记录都非常慢。我怎样才能加快速度呢?我应该采取另一种方式吗?
遗憾的是,我无法更改数据库架构或“syspath”字段。

任何帮助都会很棒,谢谢。

2 个答案:

答案 0 :(得分:1)

好吧,我的建议是在pages中创建一个列,并将整个值存储为信息副本。这将需要额外的空间和逻辑,但会为查询节省大量资源,尤其是使用适当的索引。这称为非规范化。

-- add a new column
ALTER TABLE `pages` ADD COLUMN `type_and_id` VARCHAR(255) NOT NULL;
-- index it
CREATE INDEX `someindexname` ON `pages` (`type_and_id`);
-- fill it with values
UPDATE `pages` SET
   `type_and_id` = CONCAT(`type`, '/', `id`);

连接将如下所示:

SELECT c.title, c.content, u.cleanpath
FROM pages c
LEFT JOIN paths p ON p.syspath = c.type_and_id;

<强>更新

抱歉,我没有看到您最初无法更改架构。猜猜这对你不起作用:(

答案 1 :(得分:0)

由于您在ON子句中使用了一个函数,因此MySQL无法为此连接使用任何索引。除非你改变数据库结构,否则你无能为力。