翻譯|使用教程|編輯:李爽夏|2019-02-15 09:39:52.000|閱讀 898 次
概述:本篇文章介紹了如何從MySQL中的多個(gè)表和視圖中獲取行計(jì)數(shù)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Navicat Premium是一個(gè)可連接多種數(shù)據(jù)庫(kù)的管理工具,它可以讓你以單一程序同時(shí)連接到MySQL、Oracle及PostgreSQL數(shù)據(jù)庫(kù),讓管理不同類型的數(shù)據(jù)庫(kù)更加的方便。
在上篇文章獲取MySQL中的高級(jí)行數(shù)(第2部分)中,我們使用了原生COUNT() 函數(shù)來(lái)計(jì)算唯一值以及滿足條件的值。在今天的最后第三部分中,我們將學(xué)習(xí)如何從數(shù)據(jù)庫(kù)或整個(gè)模式中的所有表中獲取行計(jì)數(shù)。
您不必對(duì)每個(gè)表運(yùn)行計(jì)數(shù)查詢來(lái)獲取行數(shù)。如果您計(jì)劃多次運(yùn)行外部腳本,那么這將是一件乏味的事情,并且可能需要外部腳本。
INFORMATION_SCHEMA數(shù)據(jù)庫(kù)是每個(gè)MySQL實(shí)例存儲(chǔ)有關(guān)MySQL服務(wù)器維護(hù)的所有其他數(shù)據(jù)庫(kù)的信息的地方。有時(shí)也稱為數(shù)據(jù)字典和系統(tǒng)目錄,它是查找有關(guān)數(shù)據(jù)庫(kù)、表、列的數(shù)據(jù)類型或訪問(wèn)權(quán)限的信息的理想位置。
INFORMATION_SCHEMA “TABLES”表提供有關(guān)數(shù)據(jù)庫(kù)中其他表的信息。通過(guò)查詢它,您可以通過(guò)一個(gè)查詢獲得精確的行數(shù)。
很容易獲得一個(gè)數(shù)據(jù)庫(kù)的行數(shù)。只需添加一個(gè)條件是table_schema列與數(shù)據(jù)庫(kù)名稱匹配的WHERE子句:
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 | +------------+------------+
為模式中的所有數(shù)據(jù)庫(kù)獲取行計(jì)數(shù)需要付出更多的努力。為此,我們必須使用一份準(zhǔn)備好的聲明。
在語(yǔ)句中,group_concat()函數(shù)將多行打包為一個(gè)字符串,以便將表名列表轉(zhuǎn)換為由聯(lián)合連接的多個(gè)計(jì)數(shù)的字符串。
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語(yǔ)句保存在@sql變量中,這樣我們就可以將其作為準(zhǔn)備好的語(yǔ)句運(yùn)行:
-- Execute @sql prepare s from @sql; execute s; deallocate prepare s; +-----+-----------+------------+ | db | tablename | rowcount | +-----+-----------+------------+ | DB1 | Table1 | 1457 | +-----+-----------+------------+ | DB1 | Table2 | 1029 | +-----+-----------+------------+ | DB2 | Table1 | 22002 | +-----+-----------+------------+ | DB2 | Table2 | 1022 | +-----+-----------+------------+
這些查詢將執(zhí)行得非常快,并在MyISAM表上產(chǎn)生非常精確的結(jié)果。但是,事務(wù)性存儲(chǔ)引擎(如InnoDB)不保留表中的內(nèi)部行數(shù)。相反,事務(wù)性存儲(chǔ)引擎對(duì)表中的一些隨機(jī)頁(yè)進(jìn)行采樣,然后估計(jì)整個(gè)表的總行數(shù)。MVCC(一種允許并發(fā)訪問(wèn)行的特性)的后果是,在任何一個(gè)時(shí)間點(diǎn),一行都有多個(gè)版本。因此,count(1)將取決于事務(wù)啟動(dòng)的時(shí)間及其隔離級(jí)別。在InnoDB這樣的事務(wù)性存儲(chǔ)引擎上,您可以期望計(jì)數(shù)精確到實(shí)際行數(shù)的4%以內(nèi)。
購(gòu)買Navicat Premium正版授權(quán),請(qǐng)點(diǎn)擊“”喲!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn