【问题标题】:Way around using CONCAT in a JOIN在 JOIN 中使用 CONCAT 的方法
【发布时间】:2010-11-05 18:12:37
【问题描述】:

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

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

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

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

选择 c.title、c.content、u.cleanpath
从页面 c
LEFT JOIN 路径 p ON p.syspath = CONCAT(c.type, '/', c.id);

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

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

【问题讨论】:

  • 如果无法更改数据库,则无法在 MySQL 中修复此问题。
  • 创建一个视图怎么样?还是在程序中执行sql?可以添加索引吗?

标签: sql mysql


【解决方案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 对于我们可以更改架构的类似连接,这仍然是一个非常有用的提示。谢谢:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 2020-10-10
    • 1970-01-01
    • 2015-07-20
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多