使用多个CONCAT子句优化SQL语句?

时间:2013-06-11 20:34:23

标签: mysql sql

SELECT
*

FROM
pages


INNER JOIN cms_collection ON cms_collection.collection_id LIKE 

( 
   CONCAT('%', pages.page_id, '/heading%') OR
   CONCAT('%', pages.page_id, '/content%') 
)

WHERE
site_id = 51

LIMIT 10

堆叠的CONCAT导致查询速度超慢,无论如何都要对此进行优化?实际上看起来这个语句没有按预期工作。我想基于如果collection_id是'%pages.page_id / heading%'或'%pages.page_id / content%'来做一个LIKE。

如果只存在第一个CONCAT,则此语句可以正常工作。

2 个答案:

答案 0 :(得分:2)

OR是一个逻辑运算符。它没有定义LIKE的替代方案。您需要将其拆分为两个LIKE子句。

SELECT * FROM pages
INNER JOIN cms_collection ON
(cms_collection.collection_id LIKE CONCAT('%', pages.page_id, '/heading%')) OR
(cms_collection.collection_id LIKE CONCAT('%', pages.page_id, '/content%'))
WHERE site_id = 51 LIMIT 10

如果仍然很慢,请将您的表格结构和EXPLAIN的输出添加到您的问题中。

答案 1 :(得分:0)

SELECT * FROM pages
INNER JOIN cms_collection ON
(cms_collection.collection_id LIKE CONCAT('%', pages.page_id, '/heading%'))
WHERE site_id = 51

UNION ALL

SELECT * FROM pages
INNER JOIN cms_collection ON
(cms_collection.collection_id LIKE CONCAT('%', pages.page_id, '/content%'))
WHERE site_id = 51 
LIMIT 10
;

使用UNION ALL而不是OR可以提高性能