优化shema、sql语句+索引
第二加缓存、memcached、Redis
主从读复制、读写分离
垂直拆分,根据模块耦合度,将一个大的系统分为多个小系统,也就是分布式系统
水平切分,针对数据量大的表,这一步是最麻烦的,最能考验技术水平要选择一个合理的shardingkey 为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改动。sql 中尽量带shardingkey,将数据定位到限定的表上去查,而不是扫描全部的表;
MySql 超大分页的处理方法超大的分页一般从两个方向上解决 :
数据库层面,这也是我们主要集中关注的,类似于 select * from table where age > 20 limit 100000,10 这种查询其实也是有可以优化的余地。 这句需要 load 100000 数据 然后基本上全部丢弃,支取10条数据当然比较慢。当时我们可以修改为 select * from table where id iin (slleect id from table where age >20 limit 100000,10)
这样也load 100000 的数据,但是由于索引覆盖,要查询的所有字段都在索引中,所以速度很快。同时ID 是连续的,我们还可以 select * from table where id > 100000 limit 10,效率也是不错的。优化的可能性有很多种,但是核心思想都是一样的,就是减少load的数据
-从需求的角度减少这种请求,,,主要是不做类似的需求(直接跳转到及办完页之后的具体一页,只允许逐页5查看或者按照给定的路线走,这样是可预测的,可缓存)以及防止id泄露且林旭被人恶意攻击
解决超大的分页,其实主要是靠缓存,可预测性的提前查到的内容,缓存到Redis 等 K-V数据库中,直接返回即可。
【推荐】利用延迟关联或者子查询优化超多页场景
说明: Mysql并不是跳过 offset 行,而是取offset + N 行,然后返回放弃前 offset 行,返回N行,那的那个offset 特别大的时候,效率分厂的地下,妖魔控制返回的总页数,要么对超过特定阈值的页数进行sql改写
例子:先快速定位需要获取的ID段,然后再关联
select a.* from table a , (select id from table where条件 lmit 10000,10) b where a.id = b.id