美文网首页
你可能不知道的 MySQL 知识点 - 第 2 话

你可能不知道的 MySQL 知识点 - 第 2 话

作者: ixdba | 来源:发表于2022-11-27 16:49 被阅读0次

    报表分页实现你是不是这样做?

    图 1

    对应 SQL 如下:

    show session status like '%handl%read%';
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | Handler_read_first    | 10    |
    | Handler_read_key      | 21    |
    | Handler_read_last     | 0     |
    | Handler_read_next     | 322   |
    | Handler_read_prev     | 0     |
    | Handler_read_rnd      | 12    |
    | Handler_read_rnd_next | 101   |
    +-----------------------+-------+
    7 rows in set (0.00 sec)
    
    select count(*) cnt from mysql.help_topic where help_topic_id<100;
    
    -- 假如默认一页显示 20 行
    select * from mysql.help_topic where help_topic_id<100 limit 20;
    
    show session status like '%handl%read%';
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | Handler_read_first    | 12    |
    | Handler_read_key      | 23    |
    | Handler_read_last     | 0     |
    | Handler_read_next     | 441   |
    | Handler_read_prev     | 0     |
    | Handler_read_rnd      | 12    |
    | Handler_read_rnd_next | 101   |
    +-----------------------+-------+
    7 rows in set (0.00 sec)
    

    read 开销

    • Handler_read_first:2
    • Handler_read_key:2
    • Handler_read_next:119

    被误以为的利器:SQL_CALC_FOUND_ROWS

    show session status like '%handl%read%';
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | Handler_read_first    | 12    |
    | Handler_read_key      | 23    |
    | Handler_read_last     | 0     |
    | Handler_read_next     | 441   |
    | Handler_read_prev     | 0     |
    | Handler_read_rnd      | 12    |
    | Handler_read_rnd_next | 101   |
    +-----------------------+-------+
    7 rows in set (0.01 sec)
    
    select SQL_CALC_FOUND_ROWS * 
    from mysql.help_topic 
    where help_topic_id<100 limit 20;
    
    select found_rows();
    +--------------+
    | found_rows() |
    +--------------+
    |          100 |
    +--------------+
    1 row in set (0.00 sec)
    
    show session status like '%handl%read%';
    +-----------------------+-------+
    | Variable_name         | Value |
    +-----------------------+-------+
    | Handler_read_first    | 13    |
    | Handler_read_key      | 24    |
    | Handler_read_last     | 0     |
    | Handler_read_next     | 541   |
    | Handler_read_prev     | 0     |
    | Handler_read_rnd      | 12    |
    | Handler_read_rnd_next | 101   |
    +-----------------------+-------+
    7 rows in set (0.00 sec)
    

    read 开销

    • Handler_read_first:1
    • Handler_read_key:1
    • Handler_read_next:100

    官方将砍掉 SQL_CALC_FOUND_ROWS

    图 2

    总结

    • 部分场景下使用 SQL_CALC_FOUND_ROWS 确实可以获得不错的性能提升,避免不必要的读取操作。
    • SQL_CALC_FOUND_ROWS 在 8.0 中标识将废弃。
    • SQL_CALC_FOUND_ROWS 在部分查询场景下可能获取非预期的值。

    禁止使用 SQL_CALC_FOUND_ROWS hint,而是使用 count(*) 来计算页数。

    关于我

    来源简书 - linora

    作者:EZy-1990(ixdba/linora)

    关于作者:DBA 一枚,09 年开始接触数据库。早年间从事 Oracle DBA 一职,目前专注于开源数据库领域,混过很多家公司,玩过多种数据库。

    其他说明:不能保证全文没有任何不妥之处,如有发现,不吝赐教。

    🙊🙊🙊🙊🙊🙊🙊


    相关文章

      网友评论

          本文标题:你可能不知道的 MySQL 知识点 - 第 2 话

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