1

我有一个包含超过 100 万种产品的 OpenCart 数据库。搜索查询是在两个单独的表上进行的,一个带有 ID,一个带有产品描述,使用%LIKE%查询和INNER JOIN. 我读到将两张表合二为一以摆脱 JOINS 并提高速度,你们认为这是一个好主意吗?

这是现在生成的查询:

 SELECT COUNT(DISTINCT p.product_id) AS total 
 FROM oc_product p 
 INNER JOIN oc_product_description pd 
 ON (pd.product_id = p.product_id ) 
 WHERE p.status = 1 
 AND ( pd.name LIKE 'orange' OR pd.tag LIKE 'orange')

我使用 pd.name 和 pd.tag 作为标准。

4

1 回答 1

0

从理论上讲,将两张表合二为一肯定会提高查​​询速度。但是,在某些情况下,由于繁重的读写操作,这可能不是一个简单的解决方案。如果您没有大量用户/管理员更新标签等可搜索字段值,那么将表合并为一个将是一个合理的决定。

可能还有其他几种方法可以改进查询,例如将多个可搜索字段应用于一个索引并使用子查询而不是连接。

例子:

SELECT 
    COUNT(p.product_id) AS total 
FROM 
    oc_product p 
WHERE 
    p.status = 1 
    AND 
    p.product_id IN 
    (
        SELECT 
            DISTINCT pd.product_id 
        FROM 
            oc_product_description pd 
        WHERE 
            CONCAT_WS(pd.name,pd.tag) LIKE 'orange'
    )

请检查 EXPLAIN 以获取详细信息和瓶颈。希望能帮助到你。

于 2013-10-21T23:50:52.547 回答