2011-06-01 142 views
2

我有一个大型数据库,其行数超过20,000行。我有两个表歌曲专辑在Mysql数据库中搜索字符串的速度更快

歌曲包含songid,ALBUMID,SONGNAME和表专辑包含ALBUMID,ALBUMNAME

目前,当一首歌曲的用户搜索只要他开始打字,我会立即给出结果。就像Google Instant一样。

我现在用的就是:每当用户类型我发送查询字符串到我的后端PHP文件,有我执行该查询在我的数据库是这样的:

SELECT * FROM songs, albums WHERE songs.albumid = albums.albumid AND songs.songname LIKE '%{$query_string}%'; 

但它是非常低效的使用数据库查询每次,也不可扩展,因为我的数据库每天都在增长。

因此,我希望同样的功能,但速度更快,效率和可扩展性。

而且,我不希望它是精确的模式匹配,例如:

假设,如果用户键入“的Rihana”而不是“蕾哈娜”,那么它应该能够给出相关的蕾哈娜结果。

谢谢。

回答

1

首先,你应该找到MySQL的FULLTEXT搜索支持远远比你目前的方法快的。

我怀疑你会从这个解决方案和用于搜索错误拼写的词,你会更好调查某种更多特色全文搜索引擎的支持,喜欢那种速度。这些措施包括:

  • 狮身人面像搜索
  • Solr的
  • ElasticSearch
+0

感谢詹姆斯,我现在将使用带索引的全文搜索。因为我目前无法安装这些搜索服务器。谢谢你的帮助。 – Kevindra 2011-06-01 09:34:18

1

尝试full text search

索引虽然需要MyISAM表格。

如果您需要ACID和全文搜索,使用PostgreSQL

+0

谢谢丹尼斯,这对我们来说真的很有帮助。 – Kevindra 2011-06-01 09:33:22

2

你应该索引表歌曲SONGNAME的前n个字符列,说6,以获取查询更好的性能。

触发只有经过n个字符已输入的查询搜索,说3(jQuery的自动完成有这个选项,例如)

您也可以考虑在内存中的DB如果性能是真正的关键(听起来像是),并且数据量不会消耗太多驻留内存。

谷歌,顺便说一句,不使用传统的RDBMS来执行其荒谬快速搜索(不断惊讶...)

+0

InnoDB可以选择将数据集缓存在内存中,例如,如果使用InnoDB,则不需要内存引擎。另外,Google的体系结构与您对RDBMS的评论有什么关系?这是计算的体系结构(将搜索任务分割到N台计算机上,返回结果并将其联合起来,提供给客户端)。 – 2011-06-01 09:19:21

+0

可以请你告诉我如何索引前N个字符的歌名(varchar)。 ? – Kevindra 2011-06-01 09:32:17

+0

当然,只是在N个服务器上分割搜索,联合并提供给客户端(不是每个人都有N个服务器可用,可能是OP的情况)。 Google严重破碎,并且不使用RDBMS(可能会影响性能)?好的一点,对于OP来说,InnoDB内存缓存可能是一个很好的选择。 – virtualeyes 2011-06-01 09:33:31

相关问题