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

执行mysql查询需要30秒…太长

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

    我直接从phpMyAdmin运行它,大约花了20秒完成。

    下面是我正在运行的查询:

    SELECT * , bb_business.id AS bid
    FROM bb_business
    LEFT OUTER JOIN bb_offers ON bb_business.id = bb_offers.store_id
    LEFT OUTER JOIN bb_cat_business ON bb_business.id = bb_cat_business.store_id
    LEFT OUTER JOIN bb_categories ON bb_categories.id = bb_cat_business.cat_id
    WHERE bb_business.active = '1'
    AND (
    bb_business.business_name LIKE '%altas%'
    OR bb_categories.category_name LIKE '%altas%'
    OR bb_business.business_name LIKE '%juice%'
    OR bb_categories.category_name LIKE '%juice%'
    )
    AND (
    bb_business.city LIKE '%%'
    OR bb_business.state LIKE '%%'
    OR bb_business.zip LIKE '%%'
    )
    GROUP BY bb_business.business_name
    ORDER BY bb_business.business_name DESC 
    LIMIT 1 , 10`
    

    bb_ach            128 InnoDB latin1_swedish_ci 32.0 KB - 
    bb_business       2,862 InnoDB latin1_swedish_ci 1.6 MB - 
    bb_categories     15 MyISAM utf8_general_ci 6.7 KB 60 Bytes
    
    bb_cat_business   2,926 MyISAM utf8_general_ci 49.6 KB 17 Bytes
    
    bb_emails         13 MyISAM utf8_general_ci 6.0 KB - 
    bb_member         409 MyISAM utf8_general_ci 62.7 KB - 
    bb_member_card    593 MyISAM utf8_general_ci 112.1 KB - 
    bb_merchant       154 InnoDB latin1_swedish_ci 32.0 KB - 
    bb_offers         80 InnoDB latin1_swedish_ci 16.0 KB - 
    bb_products       2 InnoDB latin1_swedish_ci 32.0 KB 
    

    如果我能提供什么。请告诉我。

    非常感谢你的帮助。

    编辑##################################

    好吧,用OMG的建议,我改变了一些东西。做了一些MyISAM的东西,并创建了一些全文索引。

    最后我问了这个问题:

    SELECT *, bb_business.id AS bid FROM bb_business 
    LEFT OUTER JOIN bb_offers ON bb_business.id = bb_offers.store_id 
    LEFT OUTER JOIN bb_cat_business ON bb_business.id = bb_cat_business.store_id 
    LEFT OUTER JOIN bb_categories ON bb_categories.id = bb_cat_business.cat_id 
    WHERE bb_business.active = '1' AND 
    MATCH(bb_business.business_name) AGAINST ('".addslashes($business)."') OR 
    MATCH(bb_categories.category_name) AGAINST ('".addslashes($business)."') OR 
    MATCH (bb_business.city,bb_business.state,bb_business.zip) AGAINST ('".addslashes($city)."') 
    GROUP BY bb_business.business_name 
    ORDER BY bb_business.imported,".$this->sortCol." ".$this->sortDirection." LIMIT ".$this->start.",".$this->limit
    

    我认为这使它更慢;)

    解释如下:

    id  select_type  table  type  possible_keys  key  key_len  ref  rows  Extra  
    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 
    

    还有什么想法吗?我很乐意请人帮忙。

    3 回复  |  直到 16 年前
        1
  •  2
  •   OMG Ponies    16 年前

    从表面上看,这是我的重写:

       SELECT *, bb_business.id AS bid
         FROM bb_business b
    LEFT JOIN bb_offers o ON o.store_id = b.id
    LEFT JOIN bb_cat_business cb ON cb.store_id = b.id
    LEFT JOIN bb_categories c ON c.id = cb.cat_id
        WHERE b.active = '1'
          AND (    bb_business.business_name LIKE '%altas%'
                OR bb_business.business_name LIKE '%juice%'
                OR MATCH(c.category_name) AGAINST ('altas', 'juice'))          
     GROUP BY b.business_name
     ORDER BY b.business_name DESC 
        LIMIT 0, 10
    
    • 您可以在MyISAM表上使用全文搜索(FTS)功能,这是 MATCH() .. AGAINST 是。您可以通过添加全文索引使其更快。。。
    • SELECT *
        2
  •  1
  •   Frank Heikens    16 年前

    使用EXPLAIN查看发生了什么,数据库是如何执行数据库的。

    就像会破坏性能一样,当参数以%开头时,数据库不能使用任何索引。

        3
  •  0
  •   Senica Gonzalez    16 年前

    只是想回来重新评论一下,然后贴出答案。最后我创建了一个索引表,并创建了一个PHP脚本来索引主数据库。底线是MySQL没有很好地处理跨多个表的多个匹配。

    推荐文章