使用LIKE和CONCAT的MySQL / ORACLE性能

时间:2019-01-22 09:45:54

标签: mysql oracle performance

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

-preemptedAMContainers
-preemptedNonAMContainers
-preemptedResources='<memory:0\, vCores:0>'

db.yourCollection.aggregate({ $group: { _id : null, sum : { $sum: "$amount" } } });

我对第二种感觉很强烈,但是我想确定。

3 个答案:

答案 0 :(得分:2)

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%";

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

答案 1 :(得分:1)

首先,这两个查询不等同。如果在 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%'

答案 2 :(得分:0)

(MySQL答复)

这两种方法都将涉及全表扫描,因此两者都不快。 (获取行比评估表达式更昂贵。)此外,前导通配符意味着必须对字符串进行完全扫描;无法使用INDEX

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