在大桌子上搜索文本最有效的方法是什么
本文关键字:有效 方法 是什么 文本 搜索 | 更新日期: 2023-09-27 18:20:26
我需要在一个大约有150000行的表上搜索一个文本字段(varchar 500)。
我尝试的第一个选项是直接在数据库服务器上执行一个存储过程,它看起来像:
Select p.ProductID,
p.ProductDescription,
p.SalesPrice
From Products p
Where p.ProductDescription Like '%' + @PartialDescription + '%'
结果相当缓慢。即使使用ProductDescription上的索引,性能也不够快。
我提出的下一个解决方案分为以下步骤:
- 将整个"产品"表读取到"类型产品列表"中并将其缓存
每次我需要进行搜索时,我都会浏览集合并进行字符串比较,如下所示
List<Product> searchResultItems = new List<Product>(); for (int i = 0; i < cachedProducts.Count; i++) { Product p = cachedProducts[i]; if (p.Description.IndexOf(partialDescription, StringComparison.OrdinalIgnoreCase)>=0) { searchResultItems.Add(p); } } return searchResultItems;
这个解决方案比直接在数据库中搜索要快一点。通过将表缓存在内存中,它在很大程度上避免了数据库调用。然而,与传统系统(10多年前在FileMaker上构建)相比,它仍然很慢。我没有访问遗留系统的源代码,也不太了解它
使用MS SQL Server 2008数据库,在C#上编写代码,并在System.Runtime.cache上使用ObjectCache进行缓存,我希望我的解决方案能够轻松超越传统系统。令人尴尬的是,事实并非如此。如何优化我的搜索方法?我做错了什么?上面的函数驻留在WCF服务中,由web应用程序使用(basicHttpBinding),没有任何花哨的控件。我能做些什么让它更快?
直接搜索数据库,通过任何类型的优化,这是否是一个更好的解决方案?如何优化它?
如果您使用的是MS SQL 2008,我建议您使用全文搜索。在表格上启用FT索引,然后按照FTS提示搜索文本。
因为搜索的是带有通配符前缀的值,所以索引将无法使用,因此它将始终进行表扫描。
你可以查看全文搜索。
即使使用ProductDescription上的索引,性能也不够快。
面向初学者的SQL:
"%"+@PartialDescription+"%"
触发全表扫描时,由于起始值"%",无法使用索引。标准索引用于搜索单个单词。
如果你能处理删除它-那么基本上你可以使用索引,并且应该立即返回
在一张有大约150000行的桌子上
玩具尺寸。卸载您在2gb vps上运行的程序。
我会删除%或转到全文索引。