Navicat使用教程:从MySQL中的多个表和视图中获取行计数(第3部分)

下载Navicat Premium最新版本mysql

Navicat Premium是一个可链接多种数据库的管理工具,它可让你以单一程序同时链接到MySQL、Oracle及PostgreSQL数据库,让管理不一样类型的数据库更加的方便。sql

在上篇文章获取MySQL中的高级行数(第2部分)中,咱们使用了原生COUNT() 函数来计算惟一值以及知足条件的值。在今天的最后第三部分中,咱们将学习如何从数据库或整个模式中的全部表中获取行计数。数据库

查询信息模式数据库

您没必要对每一个表运行计数查询来获取行数。若是您计划屡次运行外部脚本,那么这将是一件乏味的事情,而且可能须要外部脚本。服务器

INFORMATION_SCHEMA数据库是每一个MySQL实例存储有关MySQL服务器维护的全部其余数据库的信息的地方。有时也称为数据字典和系统目录,它是查找有关数据库、表、列的数据类型或访问权限的信息的理想位置。架构

INFORMATION_SCHEMA “TABLES”表提供有关数据库中其余表的信息。经过查询它,您能够经过一个查询得到精确的行数。并发

一个数据库的表计数

很容易得到一个数据库的行数。只需添加一个条件是table_schema列与数据库名称匹配的WHERE子句:函数

1工具

2学习

3ui

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

SELECT

    TABLE_NAME,

    TABLE_ROWS

FROM

    `information_schema`.`tables`

WHERE

    `table_schema` = 'YOUR_DB_NAME';

+------------+------------+

| TABLE_NAME | TABLE_ROWS |

+------------+------------+

| Table1     | 105        |

+------------+------------+

| Table2     | 10299      |

+------------+------------+

| Table3     | 0          |

+------------+------------+

| Table4     | 1045       |

+------------+------------+

整个架构的表计数

为模式中的全部数据库获取行计数须要付出更多的努力。为此,咱们必须使用一份准备好的声明。

在语句中,group_concat()函数将多行打包为一个字符串,以便将表名列表转换为由联合链接的多个计数的字符串。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

Select

  -- Sort the tables by count

  concat(

    'select * from (',

    -- Aggregate rows into a single string connected by unions

    group_concat(

      -- Build a "select count(1) from db.tablename" per table

      concat('select ',

        quote(db), ' db, ',

        quote(tablename), ' tablename, '

        'count(1) "rowcount" ',

        'from ', db, '.', tablename)

      separator ' union ')

    ') t order by 3 desc')

into @sql

from (

  select

    table_schema db,

    table_name tablename

  from information_schema.tables

  where table_schema not in

    ('performance_schema''mysql''information_schema')

) t;

咱们链接的select语句保存在@sql变量中,这样咱们就能够将其做为准备好的语句运行:

1

2

3

4

5

6

7

8

9

10

11

12

13

-- Execute @sql

prepare from @sqlexecute s; deallocate prepare s;

+-----+-----------+------------+

| db  | tablename | rowcount   |

+-----+-----------+------------+

| DB1 | Table1    | 1457       |

+-----+-----------+------------+

| DB1 | Table2    | 1029       |

+-----+-----------+------------+

| DB2 | Table1    | 22002      |

+-----+-----------+------------+

| DB2 | Table2    | 1022       |

+-----+-----------+------------+

关于速度和准确性

这些查询将执行得很是快,并在MyISAM表上产生很是精确的结果。可是,事务性存储引擎(如InnoDB)不保留表中的内部行数。相反,事务性存储引擎对表中的一些随机页进行采样,而后估计整个表的总行数。MVCC(一种容许并发访问行的特性)的后果是,在任何一个时间点,一行都有多个版本。所以,count(1)将取决于事务启动的时间及其隔离级别。在InnoDB这样的事务性存储引擎上,您能够指望计数精确到实际行数的4%之内。

相关文章
相关标签/搜索