繁体   English   中英

如何优化mysql查询?

[英]How to optimize mysql query?

该查询需要很长时间才能执行。 有人告诉我如何优化此查询吗?

SELECT distinct(node.nid) AS nid ,
       CAST((LENGTH(node_data_field_pdfextract.field_pdfextract_value) - LENGTH(REPLACE(LOWER(node_data_field_pdfextract.field_pdfextract_value) , 'test', ''))) / LENGTH('test') AS UNSIGNED ) AS name_match ,
       node.title AS node_title,
       node_data_field_first_name.field_cj_article_author_name_value,
       node_data_field_first_name.field_first_name_value
FROM ram_node node
LEFT JOIN
  (SELECT td.tid,
          tn.vid AS revision
   FROM ram_term_data td
   INNER JOIN ram_term_node tn ON tn.tid = td.tid
   WHERE td.vid IN (12,
                    15,
                    14)) term_data_node ON node.vid = term_data_node.revision
LEFT JOIN ram_content_type_cj_article node_data_field_first_name ON node.vid = node_data_field_first_name.vid
LEFT JOIN ram_node_revisions node_revisions ON node.vid = node_revisions.vid
LEFT JOIN ram_term_node term_node ON node.vid = term_node.vid
LEFT JOIN ram_term_data term_data ON term_node.tid = term_data.tid
LEFT JOIN ram_content_field_pdfextract node_data_field_pdfextract ON node.vid = node_data_field_pdfextract.vid
LEFT JOIN ram_uc_products uc_products ON node.vid = uc_products.vid
WHERE (node.status = 1)
  AND (node.type IN ('cj_article'))
  AND ((UPPER(node_revisions.body) LIKE UPPER('%test%'))
       OR UPPER(node_data_field_pdfextract.field_pdfextract_value) LIKE UPPER('%test%'))
  AND (UPPER(node.title) LIKE UPPER('%%'))
ORDER BY name_match DESC;

阶段1,删除所有不必要的联接。 您仅在select子句和where子句中使用node和node_data_field_pdfextract。

阶段2,因为您在where子句中引用了node_data_field_pdfextract,所以对该表使用左连接没有任何意义,请改用效率更高的INNER JOIN。

第三步,真的需要吗? 它需要很多资源。 如果不需要,请摆脱它。

步骤4,where子句是否要求使用UPPER()? 将函数应用于字段时,在大多数情况下,拒绝使用该字段上的任何索引都会导致全表扫描。 如果可能的话,请取消这些功能。 考虑将数据存储在UPPER中并对其建立索引。

对于步骤1,2和3:

SELECT
      node.nid                                                                                                            AS nid
    , CAST((LENGTH(node_data_field_pdfextract.field_pdfextract_value) 
     - LENGTH(REPLACE(LOWER(node_data_field_pdfextract.field_pdfextract_value), 'test', ''))) / LENGTH('test') AS UNSIGNED) AS name_match
    , node.title                                                                                                            AS node_title
    , node_data_field_first_name.field_cj_article_author_name_value
    , node_data_field_first_name.field_first_name_value
FROM ram_node node
      INNER JOIN ram_content_field_pdfextract node_data_field_pdfextract
                  ON node.vid = node_data_field_pdfextract.vid
WHERE node.status = 1
      AND node.type IN ('cj_article')
      AND (
             UPPER(node_revisions.body) LIKE UPPER('%test%')
            OR 
             UPPER(node_data_field_pdfextract.field_pdfextract_value) LIKE UPPER('%test%')
           )
      AND UPPER(node.title) LIKE UPPER('%%')
ORDER BY
      name_match DESC;

顺便选择SELECT(node.nid)

那些括号仅被解析器忽略。 区别不是函数

DISTINCT限定SELECT(即将“ SELECT DISTINCT”视为一对单词)加上:

SELECT DISTINCT是“行运算符”; 它是对行的所有部分执行的,当然不仅限于括号中的字段。

我建议您停止使用这些括号,因为它使您认为它所做的事情根本无法做到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM