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,则此语句可以正常工作。
答案 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可以提高性能