gpt4 book ai didi

php - mysql 查询需要 30 秒执行...太长

转载 作者:行者123 更新时间:2023-11-29 06:21:13 26 4
gpt4 key购买 nike

我正在尝试运行 MySQL 查询作为网站上的搜索,但它需要很长时间。

我直接从 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`

速度:显示第 0 - 0 行(总共 1 行,查询耗时 20.1130 秒)

我不确定向您展示结构的最佳方式。但这里复制并粘贴了一些表格的排序规则:

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 Ponies 的建议,我改变了一些东西。制作了一些 MyISAM 内容并创建了一些 FULLTEXT 索引以供使用。

我最终得到了这个查询:

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

因此结果是第一个查询最多需要 40 秒才能完成。如果我再次搜索完全相同的短语,速度正如我期望的 MYSQL 执行的那样。以毫秒为单位。这只是第一次搜索,需要永远...

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

最佳答案

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

   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
  • LIMIT 从 0 开始 - 从 1 开始将省略第一个记录。
  • 您可以在 MyISAM 表上使用全文搜索 (FTS) 功能,这就是 MATCH() .. AGAINST 的作用。您可以通过添加全文索引来加快速度...
  • SELECT * 是一种不好的方法 - 最好拼写出您真正想要的每个内容

关于php - mysql 查询需要 30 秒执行...太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3504263/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com