【问题标题】:MySQL/ORACLE performance using LIKE and CONCAT使用 LIKE 和 CONCAT 的 MySQL/ORACLE 性能
【发布时间】:2019-06-15 18:03:00
【问题描述】:

这两个查询中的哪一个在 MySQL 和/或 ORACLE 中表现更好?

SELECT * 
FROM User 
WHERE name LIKE "%searchTerm%"
OR lastname LIKE "%searchTerm%" 
OR email LIKE "%searchTerm%";

SELECT * 
FROM User 
WHERE CONCAT(name, " ", lastname, " ", email) LIKE "%searchTerm%";

我对第二个有强烈的感觉,但我想确定一下。

【问题讨论】:

  • Explain 有什么用?
  • 它们很可能都会进行全表扫描,因此它们之间可能没有太大区别。在 Oracle 中,您可以在连接列上构建基于函数的索引,这可能会让您对索引进行全面快速扫描。 .
  • 示例没有适用于 Oracle 的有效语法。必须使用单引号,并且CONCAT只有两个参数并且必须嵌套或使用||

标签: mysql oracle performance


【解决方案1】:
SELECT * 
FROM User 
WHERE name LIKE "%searchTerm%"
OR lastname LIKE "%searchTerm%" 
OR email LIKE "%searchTerm%";

这个查询比第二个查询更好。因为如果您想在所有字段上使用不同的过滤器,那么您可以轻松使用它们。

SELECT * 
FROM User 
WHERE CONCAT(name, " ", lastname, " ", email) LIKE "%searchTerm%";

在此查询中,您不能使用不同的过滤器。 您必须在所有字段上使用通用过滤器。

【讨论】:

    【解决方案2】:

    首先,这两个查询不等价。如果 searchTerm 中可能使用空白(连接分隔符),则第一个查询可能不匹配,但第二个可以,因为匹配跨越两列或三列。

    性能将非常相似,因为两个查询都进行全表扫描,不同之处仅在于 过滤条件

    第一次查询

       1 - filter("NAME" IS NOT NULL AND "NAME" IS NOT NULL AND "NAME" LIKE 
                  '%searchTerm%' OR "LASTNAME" IS NOT NULL AND "LASTNAME" IS NOT NULL AND 
                  "LASTNAME" LIKE '%searchTerm%' OR "EMAIL" IS NOT NULL AND "EMAIL" IS 
                  NOT NULL AND "EMAIL" LIKE '%searchTerm%')
    

    第二次查询

      1 - filter("NAME"||' '||"LASTNAME"||' '||"EMAIL" LIKE '%searchTerm%')
    

    所以基本上这两种查询都不适合在非平凡的表上进行客户搜索

    您通常希望将搜索限制在可以使用索引的column LIKE 'xxxxxx%'

    【讨论】:

      【解决方案3】:

      (MySQL 答案)

      无论哪种方式都将涉及全表扫描,因此都不会很快。 (获取行比评估表达式的成本更高。)此外,前导通配符意味着必须完全扫描字符串;没有INDEX 可用。

      如果您的“serachTerm”总是单词,则使用FULLTEXT(name, lastname, email)MATCH(name, lastname, email) AGAINST ("+searchTerm" IN BOOLEAN MODE);会快很多

      【讨论】:

        猜你喜欢
        • 2011-09-01
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 2015-11-17
        • 2013-05-16
        • 2016-09-11
        • 1970-01-01
        相关资源
        最近更新 更多