美文网首页
MySql千万级数据分页查询效率提升

MySql千万级数据分页查询效率提升

作者: 红尘丶 | 来源:发表于2020-07-21 18:00 被阅读0次

    日常项目随着业务扩张,mysql存储数据量大时(千万级+)使用limit分页,随着页码的增大,查询效率会变的低下。
    数据量在万级别,任何查询只要sql正常,用户体验估计无感知。作为码农应时刻以代码最优实现为目标。
    示例:
    table_test:除id自增主键外,其余字段均为设置索引。

    分页查询

    limit原理:扫描n+size条数据,丢弃前n条,返回size条,故越后越慢。

    SELECT * from table_test LIMIT 10 OFFSET 20000000 
    # 在4kw数据下,查询时间233.385s
    
    优化1

    减少扫描行数,提升查询速度

    SELECT * from table_test WHERE id >= 20000000 LIMIT 10 
    
    优化2

    子查询

    SELECT * from table_test WHERE id >= 
    (SELECT id from table_test  limit 20000000 ,1) LIMIT 10
    
    优化3

    另一种方式的子查询

    SELECT a.* from table_test a 
    JOIN (SELECT id from table_test limit 20000000, 10) b 
    ON b.id = a.id
    

    优化后的速度3.232s,建议若有可排序字段,根据实际情况加入到查询语句,也能提升效率。不管采用哪种优化方案,查询效率相比未优化都是质的提升。

    再来一发:

    我们在按固定条件查询时【查询条件是非索引字段】,一般会这么写,如:

    select * from table_test where  name = '张三' 
    

    初看查询语句,没任何问题,但在数据量大时,查询效率极低。
    测试发现:上述语句查询在4kw数据量时,查询时间xxx,emmm....反正是半天没查出来,手动stop了。
    改良:加上limit 1,查询时间3.023s。

    总之

    优化思想:尽量减少mysql查询时扫描的行数。

    相关文章

      网友评论

          本文标题:MySql千万级数据分页查询效率提升

          本文链接:https://www.haomeiwen.com/subject/csjikktx.html