问题描述
我使用 MysqL 进行分面搜索,它对测试数据很好。然后我上传 7000 个项目和 20000 个过滤项目关系。现在,一些为每个过滤器计算项目数量的查询需要很多时间。 每个类别都有自己的过滤器。每个过滤器都有自己的过滤器值 (filter_v_id)。 为简单起见,我将展示两个表格:
CREATE TABLE `item_cat` (
`item_id` int(11) NOT NULL,`category_id` int(11) NOT NULL,`publicate` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `item_cat`
ADD PRIMARY KEY (`item_id`,`category_id`),ADD KEY `item_id` (`item_id`),ADD KEY `category_id` (`category_id`);
CREATE TABLE `filter_item` (
`item_id` int(11) NOT NULL,`filter_id` int(11) NOT NULL,`filter_v_id` int(11) NOT NULL,`filter_v` decimal(10,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `filter_item`
ADD PRIMARY KEY (`item_id`,`filter_id`,`filter_v_id`),ADD KEY `item_id_2` (`item_id`,`filter_id`),ADD KEY `item_id_3` (`item_id`,ADD KEY `filter_id` (`filter_id`,ADD KEY `filter_id_2` (`filter_id`);
DB Fiddle - fast query Category_id=70 有 46 个项目,任何一组过滤器都很快(100-150 毫秒)
SELECT `filter_id`,`filter_v_id`,count(`item_id`) as `cnt` FROM
(SELECT * FROM `item_cat` WHERE `category_id`='70') as `ic`
JOIN `filter_item` as `fi` USING(`item_id`)
WHERE `item_id` IN(
SELECT `ic`.`item_id` FROM
(SELECT * FROM `item_cat` WHERE `category_id`='70') as `ic`
JOIN `filter_item` as `fi` USING(`item_id`)
GROUP BY `ic`.`item_id`
HAVING (
(`fi`.`filter_id` = '1' OR MAX(`fi`.`filter_v_id` = '932')=1 OR MAX(`fi`.`filter_v_id` = '938')=1 OR MAX(`fi`.`filter_v_id` = '1006')=1 )
AND (`fi`.`filter_id` = '17' OR MAX(`fi`.`filter_v_id` = '563')=1 )
AND (`fi`.`filter_id` = '28' OR MAX(`fi`.`filter_v` >= '2' AND `fi`.`filter_v` <= '22500')=1)
AND (`fi`.`filter_id` = '46' OR MAX(`fi`.`filter_v_id` = '580')=1 OR MAX(`fi`.`filter_v_id` = '595')=1 OR MAX(`fi`.`filter_v_id` = '559')=1 )
AND (`fi`.`filter_id` = '70' OR MAX(`fi`.`filter_v_id` = '564')=1 )
AND (`fi`.`filter_id` = '73' OR MAX(`fi`.`filter_v_id` = '562')=1 )
AND (`fi`.`filter_id` = '74' OR MAX(`fi`.`filter_v_id` = '561')=1 )
)
)
GROUP BY `filter_id`,`filter_v_id`
DB Fiddle - slow query Category_id=52 有 651 个项目,应用一个过滤器需要 3000ms+
SELECT `filter_id`,count(`item_id`) as `cnt` FROM
(SELECT * FROM `item_cat` WHERE `category_id`='52') as `ic`
JOIN `filter_item` as `fi` USING(`item_id`)
WHERE `item_id` IN(
SELECT `item_id` FROM
(SELECT * FROM `item_cat` WHERE `category_id`='52') as `ic`
JOIN `filter_item` as `fi` USING(`item_id`)
GROUP BY `ic`.`item_id`
HAVING (
(`fi`.`filter_id` = '47' OR MAX(`fi`.`filter_v_id` = '474')=1 )
)
)
GROUP BY `filter_id`,`filter_v_id`
请告诉我如何提高查询速度?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)