Navicat使用教程:從MySQL中的多個表和視圖中獲取行計數(第3部分)

下載Navicat Premium最新版本

Navicat Premium是一個可連接多種數據庫的管理工具,它可以讓你以單一程序同時連接到MySQL、Oracle及PostgreSQL數據庫,讓管理不同類型的數據庫更加的方便。

在上篇文章獲取MySQL中的高級行數(第2部分)中,我們使用了原生COUNT() 函數來計算唯一值以及滿足條件的值。在今天的最後第三部分中,我們將學習如何從數據庫或整個模式中的所有表中獲取行計數。

查詢信息模式數據庫

您不必對每個表運行計數查詢來獲取行數。如果您計劃多次運行外部腳本,那麼這將是一件乏味的事情,並且可能需要外部腳本。

INFORMATION_SCHEMA數據庫是每個MySQL實例存儲有關MySQL服務器維護的所有其他數據庫的信息的地方。有時也稱爲數據字典和系統目錄,它是查找有關數據庫、表、列的數據類型或訪問權限的信息的理想位置。

INFORMATION_SCHEMA “TABLES”表提供有關數據庫中其他表的信息。通過查詢它,您可以通過一個查詢獲得精確的行數。

一個數據庫的表計數

很容易獲得一個數據庫的行數。只需添加一個條件是table_schema列與數據庫名稱匹配的WHERE子句:

1
2
3
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 @sql; execute 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%以內。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章