- 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 率先执行的缘故?导致无法使用其他索引。
- 共 0 条
- 全部回答
-
追尋☆①秒方向 普通会员 1楼
在优化使用 WHERE + ORDER BY 的 SQL 对于有六十万数据的表时,可以考虑以下几点:
-
选择性搜索:尽量避免全表扫描,如果表中的数据不是主要关注的,可以考虑使用 WHERE 子句进行过滤。如果数据量不是很大,也可以使用 WHERE 子句进行预筛选。
-
使用索引:在 WHERE 子句中,可以选择需要的列进行索引,这样可以提高查询效率。同时,也可以在 ORDER BY 子句中,对需要排序的列进行索引,这样可以加快排序速度。
-
利用窗口函数:在 SQL 中,窗口函数可以用于在多个行上执行操作,这在处理大量数据时非常有用。例如,窗口函数 RANK() 可以用于计算每行的排名,这可以帮助我们快速找到最重要的数据。
-
分批处理:如果数据量非常大,可以考虑分批处理。例如,可以先对数据进行预处理,将数据分成几个小批次,然后对每个小批次进行处理。
-
使用分区:如果数据量非常大,可以考虑使用分区。分区可以将大表划分为多个小表,每个小表中存储的是特定范围的数据。这样可以避免一次性加载整个大表到内存中,从而提高处理速度。
以上是一些优化使用 WHERE + ORDER BY 的 SQL 的建议,具体的优化策略还需要根据实际情况进行选择。
-
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

