重温MySQL多重匹配查询....需要很长时间

时间:2010-08-19 14:19:52

标签: mysql match

我几天前正在修改我的问题。重写了我的询问。

有人可以告诉我为什么在多个表上运行任何类型的查询需要这么长时间使用我将在下面发布的查询?

有没有人有时间帮我解决这个问题?我可以支付200.00美元,我认为这对两个小时的工作有好处。我会在这里发回答案,这样每个人都会受益。

查询基本上是这样的:

SELECT bb_business.business_name, bb_business.id AS bid FROM bb_business
LEFT JOIN bb_offers       ON bb_business.id   = bb_offers.store_id
LEFT JOIN bb_cat_business ON bb_business.id   = bb_cat_business.store_id
LEFT JOIN bb_categories   ON bb_categories.id = bb_cat_business.cat_id
WHERE bb_business.active = '1'
  AND MATCH(bb_business.business_name)   AGAINST ('zebra')
  OR  MATCH(bb_categories.category_name) AGAINST ('zebra')
  OR  MATCH (bb_business.city,bb_business.state,bb_business.zip) AGAINST ('zebra')
GROUP BY bb_business.business_name
ORDER BY bb_business.business_name DESC
LIMIT 1,10

该查询第一次执行需要50秒。第二次它的速度和预期一样快。

如果我将该查询更改为仅使用一个Match Against,则速度很快。只要我添加第二个MATCH或LIKE语句,它就会恢复到40-60个执行时间。

运行该确切查询的位置为:MySQL returned an empty result set (i.e. zero rows). (Query took 47.7614 sec)

解释返回:

1 SIMPLE bb_business ALL NULL NULL NULL NULL 2877 Using temporary; Using filesort 
1 SIMPLE bb_offers ALL NULL NULL NULL NULL 94   
1 SIMPLE bb_cat_business ALL NULL NULL NULL NULL 5697   
1 SIMPLE bb_categories eq_ref PRIMARY PRIMARY 8 buxback_site.bb_cat_business.cat_id 1 Using where 

当只使用一个匹配时,查询使用我在bb_business上的全文索引。当我有多个匹配时,它似乎不使用任何索引。

以下是bb_business上的索引:

PRIMARY  PRIMARY 2877       id  
store_id  UNIQUE 2877       store_id  
index_business_name  INDEX 2877       business_name  
business_name  FULLTEXT 1       business_name  
city  FULLTEXT 1       city  
state  
zip  

以下是bb_categories的索引:

PRIMARY  PRIMARY 15       id  
category_name  UNIQUE None       category_name  
category_name_2  FULLTEXT None       category_name 

我很绝望!

感谢!

1 个答案:

答案 0 :(得分:1)

问题是你强迫MySQL创建临时表来解析查询。只要你做多场比赛,这几乎就是一个问题。

如果您的用例确实需要您这样做,那么您有两个主要选项(我可以看到)。

  1. 创建一个非规范化的汇总表,您可以在其中为需要匹配的所有列放置全文索引。然后,保持此表更新(通过触发器,存储过程,或在代码中执行查询时只需勤奋)...然后对该摘要表进行所有匹配(它应该不需要多个{{1}一个查询中的子句...)
  2. 另一种选择是使用专用搜索引擎,例如Apache SOLRSphinx。您需要单独搜索,然后从数据库中提取结果,但这些搜索引擎比MySQL强大得多(嗯,功能不强,但复杂查询更容易),并且比执行这些查询要快得多。他们可以这样做,因为他们预先指定每一个(他们牺牲了磁盘空间 - 有时候为了速度而牺牲了很多)......