我正在使用搜索查询来查找我的数据库中的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%';”
答案 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
}
}
虽然这种方式会增加主内存中的数据,因为您在那里加载了更多数据。