我需要一些优化从大表中获取查询的技巧.
Brands - id_brand - b_name Products - id_product - p_name - ean ... - fk_brand Prod_attributes - id_prod_att - size_basic ... - fk_product Stores - id_store - s_name ... Stocks - id_stock - stock_amount - fk_prod_att - fk_store
SELECT stores.s_name,stocks.stock_amount,prod_attributes.size_basic,products.p_name,products.ean,brands.b_name FROM (stocks INNER JOIN stores ON stocks.fk_store = stores.id_store) INNER JOIN (prod_attributes INNER JOIN (products INNER JOIN brands ON products.fk_brand = brands.id_brand) ON prod_attributes.fk_product = products.id_product) ON stocks.fk_prod_att = prod_attributes.id_prod_att ORDER BY s_name,p_name,size_basic LIMIT 25 OFFSET 0
这适用于小型表,但是当表增长时,查询变得非常昂贵. Stocks中有3,5M行,Prod_attributes中有300K,超过8800ms时执行25K产品,这对我来说是不可接受的.
所有的forgein键都有索引,最近对DB进行了真空分析.
我知道问题出在ORDER BY部分,因为查询不使用索引并进行顺序扫描.如果我删除了排序,那么查询速度非常快.
为了解决这个问题,我知道我可以删除ORDER BY,但对我来说这不是一个可行的选择.数据库或物化视图的反规范化也可能有助于此 – 如果可能的话,我想再次避免这种情况.
我还能做些什么来加快查询速度?
EXPLAIN ANALYZE:
– 订单减慢:http://explain.depesz.com/s/AHO
– 快速无订单:http://explain.depesz.com/s/NRxr
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。