搜索具有相关性的大型mysql数据库

Bre*_*zer 19 php mysql search inner-join left-join

我正在为我们公司的内部网构建一个相当大的"搜索"引擎,它有一个1miljon加上条目,它运行在一个相当快的服务器上,但是一些搜索查询需要1分钟.

这就是表格的外观

表

我尝试为它创建一个索引,但好像我错过了一些东西,这就是show index的显示方式

idexes

这是查询本身,它的排序大大减慢了查询,但即使没有排序的查询也有点慢.

SELECT SQL_CALC_FOUND_ROWS *
FROM `businessunit`
INNER JOIN `businessunit-postaddress` ON `businessunit`.`Id` = `businessunit-postaddress`.`BusinessUnit`
WHERE `businessunit`.`Name` LIKE 'tanto%'
ORDER BY `businessunit`.`Premium` DESC ,
CASE WHEN `businessunit`.`Name` = 'tanto'
THEN 0
WHEN `businessunit`.`Name` LIKE 'tanto %'
THEN 1
WHEN `businessunit`.`Name` LIKE 'tanto%'
THEN 2
ELSE 3
END , `businessunit`.`Name`
LIMIT 0 , 30
Run Code Online (Sandbox Code Playgroud)

很感谢任何形式的帮助

编辑: 这个查询有什么窒息99%是通过与wildcharacter的相关性排序% 当我做一个解释它说使用where; 使用fsort

Min*_*esh 18

您应该尝试使用sphinx搜索解决方案,这是一个全文搜索引擎将为您提供非常好的性能以及许多选项来设置相关性.

点击此处了解更多详情.

  • 点数+1,快速和高级搜索在SQL中不容易完成.我个人在[Solr](http://lucene.apache.org/solr/)上取得了很大的成功,它有一个[PHP的好库(Solr PHP客户端)](https://code.google的.com/p/solr的-PHP-客户机/). (4认同)

jak*_*ber 6

似乎索引没有涵盖Premium,但这是第一个ORDER BY参数.

使用EXPLAIN your query here弄清楚查询计划,改变你的索引中删除任何表扫描在解释http://dev.mysql.com/doc/refman/5.0/en/using-explain.html


Luk*_*awa 6

MySQL适用于存储数据,但在基于快速文本的搜索时效果不佳.

除了已经建议的Sphinx,我推荐两个出色的搜索引擎:

  1. Solrhttp://pecl.php.net/package/solr - 非常受欢迎的搜索引擎.用于像NetFlix这样的大型服务.

  2. 弹性搜索 - 相对较新的软件,但拥有非常活跃的社区和很多尊重

这两种解决方案都基于相同的Apache Lucene