Concat优化

时间:2016-05-12 07:13:12

标签: mysql sql

CONCAT(me.nativeName,tp.nativeName) NOT IN (SELECT CONCAT(e_node,e_n_t)
                                                          FROM m_tp_info
                                                          WHERE m_id = mid)

有没有办法优化这个concat?

1 个答案:

答案 0 :(得分:0)

对于大多数DBMS,我会以语义上有意义的方式处理这个问题:

SELECT  ...
FROM    ...
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    m_tp_info AS i
            WHERE   i.mid = me.m_id
            AND     CONCAT(i.e_node, i.e_n_t) = CONCAT(me.nativeName,tp.nativeName)
        )

但MySQL通常会优化LEFT JOIN/IS NULL better than NOT IN or NOT EXISTS,因此您可以尝试:

SELECT  ...
FROM    ...
        LEFT JOIN m_tp_info AS i
            ON i.mid = me.m_id
            AND CONCAT(i.e_node, i.e_n_t) = CONCAT(me.nativeName,tp.nativeName)
WHERE   i.mid IS NULL;

当然,如果你只是使用CONCAT,你想要比较两列而NOT IN不允许这样,那么你可以加入两列:

SELECT  ...
FROM    ...
        LEFT JOIN m_tp_info AS i
            ON i.mid = me.m_id
            AND i.e_node = me.nativeName
            AND i.e_n_t = tp.nativeName
WHERE   i.mid IS NULL;

或者

SELECT  ...
FROM    ...
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    m_tp_info AS i
            WHERE   i.mid = me.m_id
            AND     i.e_node = me.nativeName
            AND     i.e_n_t = tp.nativeName
        );