优化速度。
对于目录,我有大约150K的项目: 每个项目记录有8个搜索字段和一个Json数据字符串。 (No:int;搜索字段最多30个字符,JSON最小200:最多2000个字符)
项目编号是唯一字段,PK是所有其他字段不唯一。
No Search1 Search2 ... Search8 JSON_datastring
1 a1 a2 ... a8 {...json...}
2 b1 b2 ... b8 {...json...}
..
x a1 b2 ... c8 {...json...}
用户可以搜索八个字段中的每一个。 他可以搜索整个领域,
WHERE Search1 = 'x'
字段的开头
WHERE Search1 LIKE 'x%'
或该领域的任何部分
WHERE Search1 LIKE '%x%'
我的第一种方法是将所有数据保存在表中并在每个搜索colomns上放置一个索引; 但我想知道是否有更快的方法。
这里的目标是尽可能快地获得所有匹配的JSON_datastrings。 “选择”速度是此处唯一的关注点(用户不会进行任何更新/插入/删除命令)。 内存或磁盘空间与此项目几乎无关。 目录只需要每周更新一次,因此导入和更新时间也不是很大的问题。
我正在使用MYSQL数据库。表中的数据每周从csv文件导入。 我完全可以控制MYSQL数据库。
我预计大约60%的搜索都在整个领域。 目前n°记录150K,每年增长约20K。 并发用户:我们目前没有估算。
对于如何提高搜索速度有什么建议吗? 我还处于项目的设计阶段。
答案 0 :(得分:1)
LIKE %x%
始终需要全表扫描。无论使用哪种索引,都无法对其进行优化。相反,您应该为字段设置FULLTEXT
搜索 - 需要FULLTEXT
索引并修改查询以使用MATCH ... AGAINST
而不是LIKE
。如果不知道确切的数据很难提供进一步的改进,但通常您可能希望从搜索中卸载MySQL,将搜索移动到单独的服务(Lucene/Solr
或Sphinx
)。它们可能不仅在性能方面更合适,而且在功能方面更合适,因为它们是为搜索而构建的。