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%之內。

相關文章
相關標籤/搜索