账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    对一张有六十万数据的表,该怎么优化使用了 WHERE + ORDER BY 的 SQL?
    • 2019-02-11 00:00
    • 11
    75
    0

    各位大佬,下面这句 SQL,执行时间达到了 6s,我该怎么办?

    最终,我选择了最小影响的“新建单独索引”的方案。
    不确定这是最佳结果!只是因为我所处的环境,全面的测试较为困难,所以选择了“最快、最小影响”的处理方式。
    再次感谢 @Yujiaao@chenbinhua 两位大佬的帮助。

    业务场景

    按点计量(click_count)排序,获取 c_id 为 17 + choice 为 1 的前 20 条结果。

    SQL 原句

    SELECT `id` 
    FROM `akb48` 
    WHERE `c_id` = 17 AND `choice` = 1 ORDER BY `click_count` DESC LIMIT 20 OFFSET 600;

    SQL 分析

    "1" "SIMPLE" "akb48" N "index" "IDX_C_ID,IDX_C_ID_POINT" "IDX_CLICK_COUNT" "4" N "10281" "0.61" "Using where"

    select_type: SIMPLE;
    type: index;
    key: IDX_CLICK_COUNT
    key_len: 4
    rows: 10281;
    filtered: 0.61%;

    补充:
    表数据 60 万条,目测是因为 ORDER BY 率先执行的缘故?导致无法使用其他索引。

    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 追尋☆①秒方向 普通会员 1楼

      在优化使用 WHERE + ORDER BY 的 SQL 对于有六十万数据的表时,可以考虑以下几点:

      1. 选择性搜索:尽量避免全表扫描,如果表中的数据不是主要关注的,可以考虑使用 WHERE 子句进行过滤。如果数据量不是很大,也可以使用 WHERE 子句进行预筛选。

      2. 使用索引:在 WHERE 子句中,可以选择需要的列进行索引,这样可以提高查询效率。同时,也可以在 ORDER BY 子句中,对需要排序的列进行索引,这样可以加快排序速度。

      3. 利用窗口函数:在 SQL 中,窗口函数可以用于在多个行上执行操作,这在处理大量数据时非常有用。例如,窗口函数 RANK() 可以用于计算每行的排名,这可以帮助我们快速找到最重要的数据。

      4. 分批处理:如果数据量非常大,可以考虑分批处理。例如,可以先对数据进行预处理,将数据分成几个小批次,然后对每个小批次进行处理。

      5. 使用分区:如果数据量非常大,可以考虑使用分区。分区可以将大表划分为多个小表,每个小表中存储的是特定范围的数据。这样可以避免一次性加载整个大表到内存中,从而提高处理速度。

      以上是一些优化使用 WHERE + ORDER BY 的 SQL 的建议,具体的优化策略还需要根据实际情况进行选择。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部