mysql 日志表设计_【原创】日志表设计一例分析

关于关系表的设计归根结底有两个方面。

第一,就是完全按照范式理论去设计,一般来说达到第三范式就可以了,或者你可以划分的更细到达更上一层次。比如第四,第五,第六等等。这种设计有自己的可读性很强,但是有一点,在检索数据的时候增加了多张关系表来做关联的开销。

第二,就是在范式理论上适当的做些反范式,有的东西还是不要太剥离的好。(窄表以及宽表) 这点和软件设计中的紧耦合松耦合理论一致。

下面我就以常用的LOG表来做下演示,其中有两种表的实际,一种是窄表,一种是稍微宽一点的表。

窄表:log_ytt

mysql> show create table log_ytt;

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

| Table       | Create Table                                                                                                                                                             |

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

| log_ytt | CREATE TABLE `log_ytt` (

`ids` bigint(20) DEFAULT NULL,

`log_time` datetime DEFAULT NULL,

KEY `idx_u1` (`ids`,`log_time`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

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

1 row in set (0.00 sec)

表记录数

mysql>  select * from log_ytt where ids > '4875000001';                                                                                    +------------+---------------------+

| ids        | log_time            |

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

| 7110000001 | 2014-05-20 21:56:42 |

| 6300000001 | 2014-05-20 21:56:42 |

| 6750000001 | 2014-05-20 21:56:42 |

| 5310000001 | 2014-05-20 21:56:42 |

| 7200000001 | 2014-05-20 21:56:42 |

| 7380000001 | 2014-05-20 21:56:42 |

| 5760000001 | 2014-05-20 21:56:42 |

| 6930000001 | 2014-05-20 21:56:42 |

| 6660000001 | 2014-05-20 21:56:42 |

| 5670000001 | 2014-05-20 21:56:42 |

| 6210000001 | 2014-05-20 21:56:42 |

| 5850000001 | 2014-05-20 21:56:42 |

| 6570000001 | 2014-05-20 21:56:42 |

| 5580000001 | 2014-05-20 21:56:42 |

| 5130000001 | 2014-05-20 21:56:42 |

| 7290000001 | 2014-05-20 21:56:42 |

| 6390000001 | 2014-05-20 21:56:42 |

| 5490000001 | 2014-05-20 21:56:42 |

| 5220000001 | 2014-05-20 21:56:42 |

| 7560000001 | 2014-05-20 21:56:42 |

| 7470000001 | 2014-05-20 21:56:42 |

| 7020000001 | 2014-05-20 21:56:42 |

| 6840000001 | 2014-05-20 21:56:42 |

| 6030000001 | 2014-05-20 21:56:42 |

| 6480000001 | 2014-05-20 21:56:42 |

| 7650000001 | 2014-05-20 21:56:42 |

| 5940000001 | 2014-05-20 21:56:42 |

| 6120000001 | 2014-05-20 21:56:42 |

| 7740000001 | 2014-05-20 21:56:42 |

| 5400000001 | 2014-05-20 21:56:42 |

| 5760000001 | 2014-05-21 03:19:07 |

| 6840000001 | 2014-05-21 03:19:17 |

| 7020000001 | 2014-05-21 03:19:32 |

| 7200000001 | 2014-05-21 03:19:45 |

| 7110000001 | 2014-05-21 03:19:46 |

| 7380000001 | 2014-05-21 03:19:48 |

| 5670000001 | 2014-05-21 03:19:58 |

| 6930000001 | 2014-05-21 03:19:59 |

| 6030000001 | 2014-05-21 03:20:00 |

| 5940000001 | 2014-05-21 03:20:00 |

| 7290000001 | 2014-05-21 03:20:02 |

| 6120000001 | 2014-05-21 03:20:09 |

| 5850000001 | 2014-05-21 03:20:18 |

| 5580000001 | 2014-05-21 03:20:24 |

| 6480000001 | 2014-05-21 03:25:05 |

| 6390000001 | 2014-05-21 03:25:37 |

| 6210000001 | 2014-05-21 03:25:45 |

| 7470000001 | 2014-05-21 03:26:14 |

| 6750000001 | 2014-05-21 03:27:17 |

| 5310000001 | 2014-05-21 03:27:33 |

| 5130000001 | 2014-05-21 03:27:34 |

| 6570000001 | 2014-05-21 03:27:34 |

| 7560000001 | 2014-05-21 03:27:45 |

| 5220000001 | 2014-05-21 03:27:45 |

| 5400000001 | 2014-05-21 03:27:53 |

| 5490000001 | 2014-05-21 03:27:55 |

| 6660000001 | 2014-05-21 03:28:07 |

| 6300000001 | 2014-05-21 03:28:13 |

| 7740000001 | 2014-05-21 03:28:26 |

| 7650000001 | 2014-05-21 03:28:37 |

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

60 rows in set (0.00 sec)

接下来,我们要检索所有IDS的平均时间。 有以下两种方式:

第一, 对表进行了两次访问,并且有GROUP BY 操作,不可取。

mysql> select sec_to_time(avg(timestampdiff(second,a.times,b.times)))  as 'running'

-> from

-> (select ids,min(log_time) as times from log_ytt where 1 group by ids ) as a,

-> (select ids,max(log_time) as times from log_ytt where 1 group by ids) as b where a.ids = b.ids;

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

| running       |

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

| 05:27:08.8333 |

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

1 row in set (0.00 sec)

第二,虽然对表进行了最少的访问,但是也有一次GROUP BY 操作。也没办法,表设计如此。

mysql> SELECT SEC_TO_TIME(AVG(times)) AS 'Running' FROM

-> (

-> SELECT TIMESTAMPDIFF(SECOND,MIN(log_time),MAX(log_time)) AS times FROM log_ytt GROUP BY ids

-> ) AS T;

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

| Running       |

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

| 05:27:08.8333 |

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

1 row in set (0.00 sec)

宽表:log_ytt_horizontal.

mysql> show create table log_ytt_horizontal;

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

| Table                  | Create Table                                                                                                                                                                                              |

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

| log_ytt_horizontal | CREATE TABLE `log_ytt_horizontal` (

`ids` bigint(20) NOT NULL,

`start_time` datetime DEFAULT NULL,

`end_time` datetime DEFAULT NULL,

PRIMARY KEY (`ids`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

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

1 row in set (0.00 sec)

表记录数:

mysql> select * from log_ytt_horizontal;

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

| ids        | start_time          | end_time            |

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

| 5130000001 | 2014-05-20 21:56:42 | 2014-05-21 03:27:34 |

| 5220000001 | 2014-05-20 21:56:42 | 2014-05-21 03:27:45 |

| 5310000001 | 2014-05-20 21:56:42 | 2014-05-21 03:27:33 |

| 5400000001 | 2014-05-20 21:56:42 | 2014-05-21 03:27:53 |

| 5490000001 | 2014-05-20 21:56:42 | 2014-05-21 03:27:55 |

| 5580000001 | 2014-05-20 21:56:42 | 2014-05-21 03:20:24 |

| 5670000001 | 2014-05-20 21:56:42 | 2014-05-21 03:19:58 |

| 5760000001 | 2014-05-20 21:56:42 | 2014-05-21 03:19:07 |

| 5850000001 | 2014-05-20 21:56:42 | 2014-05-21 03:20:18 |

| 5940000001 | 2014-05-20 21:56:42 | 2014-05-21 03:20:00 |

| 6030000001 | 2014-05-20 21:56:42 | 2014-05-21 03:20:00 |

| 6120000001 | 2014-05-20 21:56:42 | 2014-05-21 03:20:09 |

| 6210000001 | 2014-05-20 21:56:42 | 2014-05-21 03:25:45 |

| 6300000001 | 2014-05-20 21:56:42 | 2014-05-21 03:28:13 |

| 6390000001 | 2014-05-20 21:56:42 | 2014-05-21 03:25:37 |

| 6480000001 | 2014-05-20 21:56:42 | 2014-05-21 03:25:05 |

| 6570000001 | 2014-05-20 21:56:42 | 2014-05-21 03:27:34 |

| 6660000001 | 2014-05-20 21:56:42 | 2014-05-21 03:28:07 |

| 6750000001 | 2014-05-20 21:56:42 | 2014-05-21 03:27:17 |

| 6840000001 | 2014-05-20 21:56:42 | 2014-05-21 03:19:17 |

| 6930000001 | 2014-05-20 21:56:42 | 2014-05-21 03:19:59 |

| 7020000001 | 2014-05-20 21:56:42 | 2014-05-21 03:19:32 |

| 7110000001 | 2014-05-20 21:56:42 | 2014-05-21 03:19:46 |

| 7200000001 | 2014-05-20 21:56:42 | 2014-05-21 03:19:45 |

| 7290000001 | 2014-05-20 21:56:42 | 2014-05-21 03:20:02 |

| 7380000001 | 2014-05-20 21:56:42 | 2014-05-21 03:19:48 |

| 7470000001 | 2014-05-20 21:56:42 | 2014-05-21 03:26:14 |

| 7560000001 | 2014-05-20 21:56:42 | 2014-05-21 03:27:45 |

| 7650000001 | 2014-05-20 21:56:42 | 2014-05-21 03:28:37 |

| 7740000001 | 2014-05-20 21:56:42 | 2014-05-21 03:28:26 |

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

30 rows in set (0.00 sec)

如果对这种稍微冗余一些的表来进行查询,那么对表的访问以及CPU的资源占用都达到了最低。

mysql> select sec_to_time(avg(timestampdiff(second,start_time,end_time))) as 'Running'  from log_ytt_horizontal;

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

| Running       |

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

| 05:27:08.8333 |

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

1 row in set (0.00 sec)

©著作权归作者所有:来自51CTO博客作者david_yeung的原创作品,如需转载,请注明出处,否则将追究法律责任

MySQL优化表设计MySQL性能优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux系统下,可以通过多个实例来运行多个MySQL服务器,每个实例可以拥有独立的配置文件、数据目录和日志文件等。这样可以方便地管理多个不同的MySQL实例,提高系统的可靠性和稳定性。下面简单介绍一下在Linux下MySQL多实例安装的过程。 1. 安装MySQL 首先需要安装MySQL,可以通过命令行或者图形界面进行安装。以Ubuntu系统为例,可以使用以下命令进行安装: ``` sudo apt-get update sudo apt-get install mysql-server ``` 2. 创建新的MySQL实例目录 在Linux系统下,每个MySQL实例需要有独立的数据目录和日志文件等。可以使用以下命令创建一个新的MySQL实例目录: ``` sudo mkdir /var/lib/mysql2 ``` 3. 复制MySQL配置文件 每个MySQL实例需要有独立的配置文件,可以通过复制默认配置文件来创建新的配置文件。以Ubuntu系统为例,可以使用以下命令复制默认配置文件: ``` sudo cp /etc/mysql/my.cnf /etc/mysql/my2.cnf ``` 4. 修改新的配置文件 修改新的配置文件,使其指向新的数据目录和日志文件等。以Ubuntu系统为例,可以使用以下命令编辑新的配置文件: ``` sudo vi /etc/mysql/my2.cnf ``` 在文件中修改以下内容: ``` [client] port = 3307 socket = /var/run/mysqld/mysqld2.sock [mysqld_safe] pid-file = /var/run/mysqld/mysqld2.pid socket = /var/run/mysqld/mysqld2.sock [mysqld] user = mysql pid-file = /var/run/mysqld/mysqld2.pid socket = /var/run/mysqld/mysqld2.sock port = 3307 basedir = /usr datadir = /var/lib/mysql2 tmpdir = /tmp log_error = /var/log/mysql/error2.log ``` 其中,需要修改的内容主要是端口号、数据目录、日志文件等。 5. 初始化新的MySQL实例 使用以下命令初始化新的MySQL实例: ``` sudo mysqld --defaults-file=/etc/mysql/my2.cnf --initialize-insecure --user=mysql ``` 其中,--defaults-file参数指定使用新的配置文件,--initialize-insecure参数示不设置root密码,--user参数示启动MySQL进程的用户。 6. 启动新的MySQL实例 使用以下命令启动新的MySQL实例: ``` sudo systemctl start mysql@2.service ``` 其中,2示新的MySQL实例的编号。 至此,多实例的MySQL服务器已经成功安装。可以通过以下命令查看多个MySQL实例的状态: ``` sudo systemctl status mysql@*.service ``` 其中,*示所有的MySQL实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值