我有一个关于在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”字段。
任何帮助都会很棒,谢谢。
答案 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无法为此连接使用任何索引。除非你改变数据库结构,否则你无能为力。