zoukankan      html  css  js  c++  java
  • information_schema.TABLE_STATISTICS

    version: 5.7.21 Percona Server

    >CREATE TABLE `t1` (
      `id` int(11) NOT NULL,
      `a` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
     
    >select * from t1;
    +----+------+
    | id | a    |
    +----+------+
    |  1 |   12 |
    |  2 |    2 |
    |  3 |    3 |
    |  4 |    4 |
    +----+------+
     
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |       118 |           17 |
    +--------------+------------+-----------+--------------+
    1 row in set (0.00 sec)
     
    >select * from t1 limit 1;
    +----+------+
    | id | a    |
    +----+------+
    |  1 |   12 |
    +----+------+
    1 row in set (0.00 sec)
     
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |       119 |           17 |

    ### 本以为是读出来几行 ROWS_READ 就加几个,没成想不是这样的,请看下面的例子

    >CREATE TABLE `t1` (
      `id` int(11) NOT NULL,
      `a` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
    
    >select * from t1;
    +----+------+
    | id | a    |
    +----+------+
    |  1 |   12 |
    |  2 |    2 |
    |  3 |    3 |
    |  4 |    4 |
    +----+------+
    
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |        87 |           16 |
    +--------------+------------+-----------+--------------+
    
    >explain select * from t1 order by a limit 1;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
    |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |   100.00 | Using filesort |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
    1 row in set, 1 warning (0.00 sec)
    
    >select * from t1 order by a limit 1;
    +----+------+
    | id | a    |
    +----+------+
    |  2 |    2 |
    +----+------+
    1 row in set (0.00 sec)
    
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |        91 |           16 |
    +--------------+------------+-----------+--------------+
    1 row in set (0.00 sec)

    ### order by 没走索引,最后走的filesort, 表里面有4条数据,最后ROWS_READ 是加的4。(应该是order by 了几条,加的就是几个),可以对比一下下面的例子

    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |        95 |           16 |
    +--------------+------------+-----------+--------------+
    
    >explain select * from t1 where id >2 order by a limit 1;
    +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------+
    | id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                       |
    +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------+
    |  1 | SIMPLE      | t1    | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    2 |   100.00 | Using where; Using filesort |
    +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------+
    1 row in set, 1 warning (0.00 sec)
    
    >select * from t1 where id >2 order by a limit 1;
    +----+------+
    | id | a    |
    +----+------+
    |  3 |    3 |
    +----+------+
    1 row in set (0.00 sec)
    
    # 可以看到ROWS_READ 加的是2,因为已经通过索引把数据过滤剩两个了。
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |        97 |           16 |
    +--------------+------------+-----------+--------------+

    ### 假如where没有用上索引,再order by 的话还是4个

    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |        91 |           16 |
    +--------------+------------+-----------+--------------+
    1 row in set (0.00 sec)
    
    >select * from t1 where a<10 order by a limit 1;
    +----+------+
    | id | a    |
    +----+------+
    |  2 |    2 |
    +----+------+
    1 row in set (0.00 sec)
    
    >explain select * from t1 where a<10 order by a limit 1;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-----------------------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                       |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-----------------------------+
    |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |    33.33 | Using where; Using filesort |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-----------------------------+
    
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |        95 |           16 |
    +--------------+------------+-----------+--------------+

    ### 但是如果条件里面没有order 并且没有filesout,limit 几个就加几个

    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |        97 |           16 |
    +--------------+------------+-----------+--------------+
    
    >explain select * from t1 limit 1;
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
    |  1 | SIMPLE      | t1    | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    4 |   100.00 | NULL  |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
    1 row in set, 1 warning (0.00 sec)
    
    > select * from t1 limit 1;
    +----+------+
    | id | a    |
    +----+------+
    |  1 |   12 |
    +----+------+
    1 row in set (0.00 sec)
    
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |        98 |           16 |
    +--------------+------------+-----------+--------------+
    1 row in set (0.00 sec)

    ### 但是 where条件里面有主键和非索引,order by非索引的话 也是limit 几就是几

    # 先插入一行数据
    >insert into t1 values(5,3);
    Query OK, 1 row affected (0.01 sec)
    
    >select * from t1;
    +----+------+
    | id | a    |
    +----+------+
    |  1 |   12 |
    |  2 |    2 |
    |  3 |    3 |
    |  4 |    4 |
    |  5 |    3 |
    +----+------+
    5 rows in set (0.00 sec)
    
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |       104 |           17 |
    +--------------+------------+-----------+--------------+
    1 row in set (0.00 sec)
    
    >explain select * from t1 where id >2 and a=3 order by a limit 1;
    +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
    | id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
    +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
    |  1 | SIMPLE      | t1    | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    3 |    20.00 | Using where |
    +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
    1 row in set, 1 warning (0.00 sec)
    
    >select * from t1 where id >2 and a=3 order by a limit 1;
    +----+------+
    | id | a    |
    +----+------+
    |  3 |    3 |
    +----+------+
    1 row in set (0.00 sec)
    
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |       105 |           17 |
    +--------------+------------+-----------+--------------+
    1 row in set (0.00 sec)

    ### 下面这个我没想明白是为什么

    a>3 已经过滤剩两行了,为啥还是加3 呢???

    难道是有filesort 的话就是扫描多少行ROWS_READ就加几吗???

    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |       115 |           17 |
    +--------------+------------+-----------+--------------+
    1 row in set (0.00 sec)
    
    >explain select * from t1 where id >2 and a>3  order by a limit 1;
    +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------+
    | id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra                       |
    +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------+
    |  1 | SIMPLE      | t1    | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    3 |    33.33 | Using where; Using filesort |
    +----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-----------------------------+
    1 row in set, 1 warning (0.01 sec)
    
    >select * from t1 where id >2 and a>3  order by a limit 1;
    +----+------+
    | id | a    |
    +----+------+
    |  4 |    4 |
    +----+------+
    1 row in set (0.01 sec)
    
    >select TABLE_SCHEMA,TABLE_NAME,ROWS_READ,ROWS_CHANGED from information_schema.TABLE_STATISTICS where TABLE_NAME="t1";
    +--------------+------------+-----------+--------------+
    | TABLE_SCHEMA | TABLE_NAME | ROWS_READ | ROWS_CHANGED |
    +--------------+------------+-----------+--------------+
    | sbtest       | t1         |       118 |           17 |
    +--------------+------------+-----------+--------------+
  • 相关阅读:
    常见问题
    查询
    多对多关系
    prototype & __proto__
    new operator
    用户
    express.Router
    Express 应用生成器
    LeanCloud
    npm常用命令
  • 原文地址:https://www.cnblogs.com/moon1223/p/11171305.html
Copyright © 2011-2022 走看看