使用Like运算符提高查询性能

时间:2018-05-02 13:15:37

标签: java mysql query-optimization sql-like

我正在使用搜索查询来查找我的数据库中的skus,而我从TrueSight报告中返回的性能不佳。

不确定我是否有办法改善表现。

我的查询是:

public SkuQuery(final DataSource ds) {
    super(ds, "SELECT sku, description1, buyer, analyst FROM descrip WHERE item_status != 3 AND sku like ? ");
    declareParameter(new SqlParameter(Types.VARCHAR));
    compile();
}

由于sku like语句,它每次运行时都会生成420,000行的完整表。如果你重写这个来在sku上做一个精确的搜索,这是主键,它在.016秒内运行。

我正在使用的模式是“sku like'%5052024%';”

2 个答案:

答案 0 :(得分:2)

您的问题不清楚是否可以使用=代替LIKE。用户是否不需要输入整个SKU号码?

如果在模式开头有通配符,则无法提高LIKE的性能。

例如,如果我要求您阅读电话簿并找到名字中包含“土地”字符的所有人,无论他们的名字是开头,中间还是结尾,您都无法利用这一事实。电话簿按名称排序。您必须仔细阅读整本书,以找到与该模式匹配的名称。

这就是通配符在LIKE条件下的工作方式。除非您的模式在开始时没有通配符,否则它将被强制执行表扫描。它不能使用索引。

MySQL中有FULLTEXT索引,允许您匹配一个或多个字符串列中的单词。但它只匹配整个单词,它不能匹配作为单词部分的模式。

您可能会喜欢我的演示文稿Full Text Search Throwdown,其中我比较了几种不同的全文索引解决方案。

答案 1 :(得分:0)

使用

之类的查询
super(ds, "SELECT sku, description1, buyer, analyst FROM descrip WHERE item_status != 3");

在java代码中,在获取sku中的数据后,循环检查,如

while([RESULT_SET-CONDITION]){
    if(sku.contains(5052024)){
        //Your Code
    }
}

虽然这种方式会增加主内存中的数据,因为您在那里加载了更多数据。