mysql表百万级数据优化limit分页(自己建的数据 只有一百多万)

1.问题

前几天老大在群里抛出这个问题说:问个问题,千万级的表查询分页,怎么优化查询
select * from user limit 10000000,10
select * from user where name="a" limit 10000000,10

2.实验

经过验证发现以上语句在数据库中执行 (100万条数据时候)至少需要2.7s ,这简直不符合规范,当然为了完成这个难题所以就简单测了一下(现实场景中很少用到查几百万分页后的数据)。

2.1 自己的第一反应就是建立索引,或者是根据索引查询。所以采用临时表的方式,先查出主键id ,然后在去查找所有值,

SELECT  * FROM USER a JOIN (SELECT    id   FROM   USER  LIMIT 3225190, 10) b ON a.id = b.id   0.5s左右

SELECT   * FROMUSER  a  JOIN    (SELECT     id    FROM  USER WHERE NAME ="池恒"   LIMIT 3225190,10) b  ON a.id = b.id  1.7s左右

结论:当临时表没有where查询时,其实并不会快多少,但是没有where查询的临时表 ,速度快了5倍左右。

其实还是不符合自己想要的规范。

2.2 终极杀招

为了能更加优化查询,自己经过查找发现,建立联合索引是一个好的方法,where 的条件 和主键id 作为索引 serach(name,id)

第一次建立索引时候 是id 在前 name在后,这样确实也解决这样的问题,都变成0.5s左右 ,但是还不是我想要的 ,最后上网搜索答案,发现建立联合索引顺序不同,性能也就大大提高,于是把建立索引顺序变成是id 在后 name在前。结果打出意料 ,速度变成了0.05秒 。性能大幅度提升,当然具体原因还没有搞清楚,后续继续分析 特此记录。

3.结果

建立联合索引,性能提升。当然这只是一种实现方式,显示场景中最好不要查询几百万数据之后数据 给用户展示也不需要这么多,当然还有的就是分表查询(没有尝试过,后期尝试继续更新)

4.19年再回头看自己写的博客发现自己真的好蠢 这个具体原因是 联合索引匹配最左原则,如果还有不理解的请加微信lx13146592025 (真实个人微信 ,有问题可以留言一起探讨)

小白一个,如有不对,请指出。谢谢!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值