连接表中的 mySQL ORDER BY

Posted

技术标签:

【中文标题】连接表中的 mySQL ORDER BY【英文标题】:mySQL ORDER BY in joined tables 【发布时间】:2013-05-28 08:06:48 【问题描述】:

好的,所以我有以下架构和查询,由于 ORDER BY,它非常慢(使用真实数据时):

http://sqlfiddle.com/#!2/5e7bb/10

根据 mysql man :“您正在连接许多表,并且 ORDER BY 中的列并非全部来自用于检索行的第一个非常量表。(这是 EXPLAIN 输出中的第一个不有一个 const 连接类型。) "

但我仍然需要按该列排序。我需要怎么做?

【问题讨论】:

【参考方案1】:

更新:因为小提琴已更新:

SELECT
    cpa.product_id, 
    cp.product_internal_ref, 
    cp.product_name, 
    cpa.product_sale_price, 
    cpa.is_product_service, 
    cpa.product_service_price
FROM 
    catalog_products_attributes cpa
JOIN
    catalog_products cp ON cp.product_id = cpa.product_id 
WHERE
    cpa.product_id IN (
        SELECT
            product_id
        FROM 
            catalog_products_categories
        WHERE
            category_id = 41 
    )
ORDER BY 
    cpa.product_service_price DESC 

【讨论】:

另外,我试过你的查询,比我的查询慢 2 倍... :( 我刚刚修改了小提琴,请看一下。使用您的解决方案确实可以大大提高性能。但我想知道在没有派生表的情况下是否还有其他方法可以做到这一点。谢谢sqlfiddle.com/#!2/5e7bb/10 我还查看了您更新的查询,但它使用了一个会影响性能的 DEPENDENT SUBQUERY(我用真实数据进行了测试) 基准测试结果如何?你可以在category_id(这将用于过滤)和cpa.product_service_price(这将用于排序)上添加一个索引 category_id 已经有一个索引,但是在 product_service_price 添加索引后,事情变得更快了:sqlfiddle.com/#!2/0874f/1

以上是关于连接表中的 mySQL ORDER BY的主要内容,如果未能解决你的问题,请参考以下文章

java中如何实现mysql中的group by order by count()功能

mysql GROUP BY、DISTINCT、ORDER BY语句优化

连接表上的 ORDER BY

MySQL优化:order by和limit

sql [mysql:ORDER BY中的CASE]在mysql的ORDER BY中使用CASE。 #mysql #sql

MySQL 查询常用操作——排序 order by