0
嗨我有一个产品类别数据库,其中产品和类别使用第三个表格具有多对多关系,例如。产品分类。目前,进出口运行以获取属于类别ID阵列上给出一个类别中的所有产品数据库的查询,让我们看看下面的例子:Mysql GROUP BY通过内部连接和大型数据集进行优化
SELECT * FROM products p JOIN product_category pc ON p.id = pc.product_id
WHERE pc.category_id IN (1,2,3,4,5,6) GROUP BY p.id LIMIT 0,40
产品表富人各地23K行和product_category表26k行。
通常,WHERE IN子句中使用的类别ID数组有更多的元素。
现在这个查询需要300ms的来获取结果。如果我删除了GROUP BY子句,那么查询只需要2ms来获取结果。
一个更完整的查询如下:
select * from `products` inner join `product_category` on `products`.`id` = `product_category`.`product_id`
where `product_category`.`category_id` in ('1', '2', '3', '4', '5', '6', '7',
'8', '44', '155', '156', '157', '158', '159', '160', '161', '162', '168', '169', '171', '172', '173', '174', '175', '176',
'178', '179', '180', '181', '182', '183', '184', '185', '186', '189', '190', '191', '192', '193', '194', '195', '196',
'197', '198', '199', '200', '201', '202', '203', '204', '205', '206', '207', '208', '209', '213', '215', '216', '217',
'218', '219', '230', '231', '232', '233',
'234', '235', '236', '237', '240', '241',
'242', '243', '244', '245', '246', '247',
'248', '249', '250', '251', '252', '253',
'254', '255', '256', '257', '258', '259',
'260', '261', '325', '326', '327', '328',
'334', '335', '336', '337', '338', '339', '340', '341', '342', '343', '344') and `products`.`is_visible` = '1'
group by `product_category`.`product_id`
order by `popularity` desc, `popularity` desc limit 40 offset 0
查询的解释如下:
所以,我的问题是,如果有一种方法来优化通过特定的方式查询组,以便不会花太长时间加载结果。
既然你不是聚合,你有没有尝试过'SELECT DISTINCT p。*'呢? – Uueerdo
@Uueerdo是的,我没有改变,带有选择差异的查询所花费的时间几乎与群组相同。谢谢 – asolenzal
哟永远不要按结构使用该组,因为不能保证总是在没有在组中指定的字段中给出相同的结果。仅仅因为你可以做点什么并不意味着你应该这样做。按照其他数据库要求的方式正确使用组。当你有一个连接时,也不要使用SELECT *,因为它返回的数据比你需要的要多(连接字段重复),这会导致查询速度慢。这两个语法问题都是SQL反模式,如果你试图通过真正理解数据库的人来传递它,你会忽略代码审查。 – HLGEM