2010-08-19 213 views
0

我正在修改我前几天的问题。重写了我的查询。重访MySQL多重匹配查询....需要这么长时间

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

有没有人有时间来帮我解决这个问题?我可以支付200美元我认为这对于两个小时的工作是很好的。我会在这里回复这个答案,这会让每个人都受益。

查询基本上是这样的:

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或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 

我绝望!

谢谢!

+0

如果你想联系我直接发送到senica在allebrum.com – 2010-08-19 14:20:36

回答

1

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

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

  1. 创建一个非归一化的汇总表,您可以在需要匹配的所有列上放置全文索引。然后,通过触发器,存储过程或在代码中执行查询时保持此表的更新(然后执行与该汇总表的所有匹配)(它应该不需要在一个表中包含多个MATCH子句)查询)...
  2. 另一种选择是使用专用搜索引擎,如Apache SOLRSphinx。你需要单独搜索,然后将结果从数据库中提取出来,但是这些搜索引擎比MySQL强大得多(虽然功能不强大,但是执行复杂查询更容易),并且比MySQL更快地执行这些查询。他们可以这样做,因为他们预先索引everyting(他们牺牲磁盘空间 - 有时它很多 - 速度)...
+0

我结束了添加一个汇总表。工作得很好,我的执行时间足够快。感谢您的建议并确认我所看到的内容。 – 2010-08-19 20:20:49

+0

你可以发布关于汇总表的链接吗?我想我需要这样做,但我在谷歌上找不到任何东西 – NaturalBornCamper 2012-09-24 15:57:15