以下查询用于在电子商务网站上搜索产品数据库时应用多个过滤器值。
这是我的查询:
无法在服务器上运行查询的 EXPLAIN 命令。但是在我的本地笔记本电脑上可以正常工作:
当使用超过7个过滤器时,MySQL服务器会崩溃。
- 是否有机会只连接一次
positions_categories_links
? - 我应该考虑改变数据库结构吗?
每个产品都有一个
eshop_cats
类别(many2one),最多有20个带有多个关系(many2many)的categories
。
eshop_pos
表具有40,000条记录,包含产品。
eshop_cats
表具有340条记录,包含主要类别。
categories
表具有6,000条记录,包含双工类别。
positions_categories_links
表具有360,000条记录,包含产品和类别之间的关键字。
这是我的查询:
SELECT COUNT(DISTINCT eshop_pos.id)
FROM eshop_pos
INNER JOIN eshop_cats t1 ON eshop_pos.eshopcatid = t1.id
AND t1.active = 1
INNER JOIN positions_categories_links t2 ON t2.pos_id = eshop_pos.id
INNER JOIN categories t3 ON t3.id = t2.cat_id
AND t3.active = 1
AND t3.section_id = 62021
INNER JOIN positions_categories_links t4 ON t4.pos_id = eshop_pos.id
INNER JOIN categories t5 ON t5.id = t4.cat_id
AND t5.active = 1
AND t5.section_id = 62023
INNER JOIN positions_categories_links AS duplex_links_51 ON duplex_links_51.pos_id = eshop_pos.id
AND duplex_links_51.cat_id = 51
AND duplex_links_51.value IN (2984)
INNER JOIN positions_categories_links AS duplex_links_52 ON duplex_links_52.pos_id = eshop_pos.id
AND duplex_links_52.cat_id = 52
AND duplex_links_52.value IN (3003)
INNER JOIN positions_categories_links AS duplex_links_3904 ON duplex_links_3904.pos_id = eshop_pos.id
AND duplex_links_3904.cat_id = 3904
AND duplex_links_3904.value IN (3941)
INNER JOIN positions_categories_links AS duplex_links_4462 ON duplex_links_4462.pos_id = eshop_pos.id
AND duplex_links_4462.cat_id = 4462
AND duplex_links_4462.value IN (4465)
INNER JOIN positions_categories_links AS duplex_links_4466 ON duplex_links_4466.pos_id = eshop_pos.id
AND duplex_links_4466.cat_id = 4466
AND duplex_links_4466.value IN (4468)
INNER JOIN positions_categories_links AS duplex_links_4472 ON duplex_links_4472.pos_id = eshop_pos.id
AND duplex_links_4472.cat_id = 4472
AND duplex_links_4472.value IN (4473)
INNER JOIN positions_categories_links AS duplex_links_4974 ON duplex_links_4974.pos_id = eshop_pos.id
AND duplex_links_4974.cat_id = 4974
AND duplex_links_4974.value IN (4978)
INNER JOIN positions_categories_links AS duplex_links_4979 ON duplex_links_4979.pos_id = eshop_pos.id
AND duplex_links_4979.cat_id = 4979
AND duplex_links_4979.value IN (4982)
INNER JOIN positions_categories_links AS duplex_links_4984 ON duplex_links_4984.pos_id = eshop_pos.id
AND duplex_links_4984.cat_id = 4984
AND duplex_links_4984.value IN (4986)
无法在服务器上运行查询的 EXPLAIN 命令。但是在我的本地笔记本电脑上可以正常工作: