MYSQL - 优化搜索表以获得速度(并且仅限速度)

时间:2014-10-08 05:25:36

标签: mysql sql performance

优化速度。

对于目录,我有大约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。 并发用户:我们目前没有估算。

对于如何提高搜索速度有什么建议吗? 我还处于项目的设计阶段。

1 个答案:

答案 0 :(得分:1)

LIKE %x%始终需要全表扫描。无论使用哪种索引,都无法对其进行优化。相反,您应该为字段设置FULLTEXT搜索 - 需要FULLTEXT索引并修改查询以使用MATCH ... AGAINST而不是LIKE。如果不知道确切的数据很难提供进一步的改进,但通常您可能希望从搜索中卸载MySQL,将搜索移动到单独的服务(Lucene/SolrSphinx)。它们可能不仅在性能方面更合适,而且在功能方面更合适,因为它们是为搜索而构建的。