65.9K
CodeProject 正在变化。 阅读更多。
Home

Infobright/MySQL 统计实用工具 (C++)

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (5投票s)

2012年7月24日

MIT

4分钟阅读

viewsIcon

21969

downloadIcon

275

在 C++ 中显示 Infobright/MySQL 数据库统计信息

介绍  

这个 C++ 程序连接到 Infobright 数据库,并显示其统计信息(大小、压缩大小、压缩率等),包括特定数据库中的数据库和表。该代码也可用于 MySQL 数据库。 

注意:您可能需要删除压缩部分,因为 MySQL 没有其数据库的压缩率。

此程序的目的是为用户提供一些关于如何使用 C++、Infobright 数据库和 MySQL 的简单代码。  

所需软件  

  • Windows 用户:带有 g++ 和数据库软件包的 Cygwin
  • Linux 用户:g++、mysql-client 和 MySQL 开发库
  • Infobright 或 MySQL 数据库    

运行可执行文件

源代码中有两种文件。可执行文件适用于 Windows 用户;二进制文件适用于 Linux 用户。

对于Windows 用户,请在 Cygwin 中运行该文件,命令如下:

./databases_windows [选项]

对于Linux 用户,请在终端中运行该程序,命令如下:

./databases_linux [选项]

选项与 mysql 命令几乎相同

  •  -u 用户名
  •  -P 端口 (注意:这是大写的 'P')
  •  -h 主机名
  •  -p (注意:此标志不接受任何参数。如果使用,程序将要求输入密码。)

未指定选项将使用默认选项。  

  • 用户名:root
  • 密码:空
  • 端口:5029
  • 主机:127.0.0.1

即,对于Windows 用户

        ./databases_windows -h 127.0.0.1

     对于Linux 用户
   
         ./databases_linux -h 127.0.0.1

注意:如果您在输入命令后看到“Permission denied”(权限被拒绝),您可能需要执行此操作来授予程序权限:

chmod +x databases_windows      和/或       chmod +x databases_linux 

这是数据库的统计信息

 

这是特定数据库中表的统计信息

编辑源代码 

如果您想查看/编辑源代码,我们已经包含了一个编译脚本。

对于Linux 用户,您需要 g++、mysql-client 和 MySQL 开发库。

    Ubuntu:sudo apt-get install g++ mysql-client libmysqlclient-dev

    CentOS:sudo yum install gcc-c++ mysql-client mysql-devel

对于Windows 用户,请安装 Cygwin  

    http://www.cygwin.com/install.html

下载setup.exe,然后按照步骤安装 gcc 和其他软件包。

    详细的安装过程请参见此处:
 
   http://www.mcclean-cooper.com/valentino/cygwin_install/

    注意:在选择软件包时,至少选择以下软件包:
        (1) Admin
        (2) Database
        (3) Devel
        (4) Libs
        (5) System
        (6) Math
        (7) Shells

分析代码

现在我们来分析一些源代码。首先,main 函数会请求参数并连接到您选择的数据库。如果您在命令行中输入“-?”或“--help”,则会调用 show_help_screen 函数并在屏幕上显示命令选项和默认设置。  

在我们显示数据库和表的统计信息之前,我们需要将统计信息保存在内存中,因为这样以后获取这些值会更容易。我个人倾向于使用链表作为数据结构。database_linked_list 是用于创建此类链表的函数。

链表的结构如下所示: 

struct table_stat {
    string table_name;
    double table_size;
    double table_raw;
    double table_compression;
    table_stat * table_next;
};
 
struct data_stat {
    string data_name;
    double compressed_size;
    double raw_size;
    double compression;
    data_stat * next;
    table_stat * mytable;
}; 

显然,table_stat 用于表统计信息,data_stat 用于数据库统计信息。每个 table_stat 都有一个指向其 table_stat 列表的指针,以及另一个指向下一个 data_stat 的指针。最后一个 table_statdata_stat 指向 NULL,以告知这是列表的最后一个块。

下图显示了这些列表之间的链接关系

此外,total_rawtotal_compressedtotal_ratio 被用作全局变量,以便保存整个数据库的原始总大小、压缩总大小和压缩总比率。 

不幸的是,您从数据库获取的统计信息是字符串形式的,这意味着数字是以字符而不是特定数字的形式保存的。因此,我们需要一个额外的步骤,我称之为 string_to_double,它的作用就像字面意思一样,将类型从字符串转换为双精度浮点数。  

代码如下:  

double string_to_double (string num){
    double return_result = 0.0;
    //first we want to find the '.'
    int i = 0;
    int no_dot = 0;
    while (num[i] != '.'){
          if (num[i] == '\0'){
             no_dot = 1;
             break;
          }
          i++;
    } 
    int dot = i;
    i--;
    double temp = 1;
    for (int j = i; j>= 0; j--){
        return_result = return_result + (((double)num[j])-48)*temp;
        temp = temp * 10;
    }
    dot++;
    temp =10;
    if (no_dot == 0){
       while (num[dot] != '\0'){
             return_result = return_result + (((double)num[dot])-48)/temp;
             dot++;
             temp =temp * 10;
       }
    }
    return return_result;
}  

创建数据结构后,我们最后需要使用 show_tableshow_data_stat 这两个函数将统计信息显示在屏幕上。最终结果显示在上图所示。  

当输入“exit”时,我们需要调用 mysql_free_resultmysql_close 这两个函数来关闭数据库。此外,由于我们为链表分配了一些内存空间,我们还需要删除这些内存以避免内存泄漏。因此,调用 delete_linked_list 来完成此操作。

有用查询 

在从 MySQL 获取数据时,我们需要使用一些查询来帮助我们获取特定信息。以下是一些我在本项目中使用过的查询。 

此查询列出了每个数据库的大小(以 MB 为单位): 

SELECT table_schema, sum( data_length + index_length ) / 1024 / 1024 'Data Base Size in MB',TABLE_COMMENT  
FROM information_schema.TABLES 
WHERE ENGINE = 'BRIGHTHOUSE' 
GROUP BY table_schema;
此查询显示当前安装的 DBMS 的版本
show variables like 'version_comment';   

此查询显示名为 test 的数据库的表统计信息: 

USE test; 
SHOW TABLE STATUS WHERE ENGINE='BRIGHTHOUSE';

注意:上面的查询是针对 Infobright 数据库的。如果您想获取 InnoDB 或 MyISAM 数据库的统计信息,请从查询中删除“where Engine='BRIGHTHOUSE'”。 

历史

最新版本同时包含 Linux 和 Windows 用户的版本。具体使用方法如上所示以及在 README.txt 文件中。

结论 

此代码旨在作为构建数据库统计应用程序的起点。鼓励您修改代码以满足您的具体需求。

© . All rights reserved.