代码之家  ›  专栏  ›  技术社区  ›  Senica Gonzalez

重新访问MySQL多重匹配查询…需要很长时间

  •  0
  • Senica Gonzalez  · 技术社区  · 15 年前

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

    有没有人有时间帮我解决这个问题?我可以付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秒。第二次它的速度很快。

    如果我将查询改为只使用一个匹配项,那么速度很快。一旦我添加了第二个匹配或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 
    

    以下是BBU业务的索引:

    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  
    

    以下是BBU类别的索引:

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

    我绝望了!

    谢谢!

    1 回复  |  直到 15 年前
        1
  •  1
  •   ircmaxell    15 年前

    问题是您正在强制MySQL创建临时表来解析查询。只要你做了多次比赛,这将是一个很大的问题。

    1. 创建一个非规范化的摘要表,在该表中可以对需要匹配的所有列放置全文索引。然后,保持此表的更新(通过触发器、存储过程,或者在代码中执行查询时仅使用diligence)。。。然后对汇总表进行所有匹配(这样就不需要有多个 MATCH
    2. 另一种选择是使用专用的搜索引擎,比如 Apache SOLR Sphinx
    推荐文章