日志表设计一例分析_MySQL
关于关系表的设计归根结底有两个方面。
第一,就是完全按照范式理论去设计,一般来说达到第三范式就可以了,或者你可以划分的更细到达更上一层次。比如第四,第五,第六等等。这种设计有自己的可读性很强,但是有一点,在检索数据的时候增加了多张关系表来做关联的开销。
第二,就是在范式理论上适当的做些反范式,有的东西还是不要太剥离的好。(窄表以及宽表) 这点和软件设计中的紧耦合松耦合理论一致。
下面我就以常用的LOG表来做下演示,其中有两种表的实际,一种是窄表,一种是稍微宽一点的表。
窄表:log_ytt
表记录数
接下来,我们要检索所有IDS的平均时间。 有以下两种方式:
第一, 对表进行了两次访问,并且有GROUP BY 操作,不可取。
第二,虽然对表进行了最少的访问,但是也有一次GROUP BY 操作。也没办法,表设计如此。
宽表:log_ytt_horizontal.
表记录数:
如果对这种稍微冗余一些的表来进行查询,那么对表的访问以及CPU的资源占用都达到了最低。
第一,就是完全按照范式理论去设计,一般来说达到第三范式就可以了,或者你可以划分的更细到达更上一层次。比如第四,第五,第六等等。这种设计有自己的可读性很强,但是有一点,在检索数据的时候增加了多张关系表来做关联的开销。
第二,就是在范式理论上适当的做些反范式,有的东西还是不要太剥离的好。(窄表以及宽表) 这点和软件设计中的紧耦合松耦合理论一致。
下面我就以常用的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)
登录后复制
第一, 对表进行了两次访问,并且有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)
登录后复制
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)
登录后复制
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)
登录后复制
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)
登录后复制
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前
By 尊渡假赌尊渡假赌尊渡假赌
击败分裂小说需要多长时间?
1 个月前
By DDD
R.E.P.O.保存文件位置:在哪里以及如何保护它?
1 个月前
By DDD
R.E.P.O.最佳图形设置
2 周前
By 尊渡假赌尊渡假赌尊渡假赌
刺客信条阴影:贝壳谜语解决方案
1 周前
By DDD

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

本文讨论了使用MySQL的Alter Table语句修改表,包括添加/删除列,重命名表/列以及更改列数据类型。

文章讨论了为MySQL配置SSL/TLS加密,包括证书生成和验证。主要问题是使用自签名证书的安全含义。[角色计数:159]

文章讨论了流行的MySQL GUI工具,例如MySQL Workbench和PhpMyAdmin,比较了它们对初学者和高级用户的功能和适合性。[159个字符]

本文讨论了使用Drop Table语句在MySQL中放下表,并强调了预防措施和风险。它强调,没有备份,该动作是不可逆转的,详细介绍了恢复方法和潜在的生产环境危害。

本文讨论了在PostgreSQL,MySQL和MongoDB等各个数据库中的JSON列上创建索引,以增强查询性能。它解释了索引特定的JSON路径的语法和好处,并列出了支持的数据库系统。

文章讨论了使用准备好的语句,输入验证和强密码策略确保针对SQL注入和蛮力攻击的MySQL。(159个字符)
