作者回复: 赞!这些优化手段都可以拿去面试。 1. 可以总结为就是尽可能查询少的字段,以及按照查询频率进行垂直分表。 3. 可以说是新手研发的常见坑了,大部分都是为了偷懒而引起的。 4. 是,冗余都好说,就是又要解决一致性问题,也挺麻烦的
作者回复: 赞!
作者回复: max_id 是前端继续往后传。 理论上来说,这个优化不适合做跳页。所以这个优化适合在 APP 这种下拉刷新的环境下。
作者回复: 学到了!居然还有专业名词!
作者回复: 回表其实是很正常的事情,只是说在性能苛刻的场景下,要避免回表。目前的数据库回表一次不到 10ms,基本都能接受。 我觉得你是想问这种动态筛选怎么设置索引吧?一般我建议是用 ES 比较好,如果用 MySQL,我建议你在最频繁的几个查询条件里面设置索引。又或者,可以通过业务折中来达成目标,比如说要求某些字段是必填。
作者回复: 风险还是很大的……因为虽然online DDL 不会阻塞增删改查,但是对服务器的压力还是存在的。也就是你这段时间 mysql 的负载还是很高。所以要看你能不能接受这种性能损耗。
作者回复: 确实,我以前也做过这种优化,不过还是挺罕见的场景
作者回复: GROUP BY 应该不行。不过要是 name 上有单独的索引,那么查询效果还可以。 有一种不精确的做法,就是线下计算一次,count(distinct(name)) 和 count(name),确认两者的比率。而后线上就只需要用 count(name) 乘以比例就可以了。又或者在 Redis 里面维护总数。
作者回复: 一个联合索引就可以了,然后把 uid 放在前面。
作者回复: 1 有比较多可以优化的选项,我讲几个。 第一个是优化磁盘调度策略,从 CFG 切换到 deadline,这两个调度策略你可以了解一下。这个优化我个人没有实践过,不知道它的效果如何; 另外一个是优化 swap,核心是尽量避免触发交换,但是也不能完全禁止 swap,因为可能内存不够崩了。 还有就是优化 TCP 连接相关的,比如说降低 fin_timeout,增大发送、接收缓冲区。 对于大部分和网络、IO 相关的中间件,你都可以从磁盘 IO、swap、TCP 三个方向上去优化。 2 啊,我发现我算错了,应该是 LIMIT 5000, 50。这就是分页的算法,第一页是 LIMIT 0, 50,第二页是 LIMIT 50, 50... 第 101 页就应该是 LIMIT 5000, 50