Mysql数据库表结构优化

合适的数据类型

  1. 使用可以存下数据的最小的数据类型
    比如,一个时间类型的一个数据,可以使用varchar,可以使用datetime,还可以使用int,如何选择,就看哪一种类型对我们来说是最小的,不言而喻,int类型相对来说是最小的数据类型。
  2. 使用简单的数据类型。
    int类型要比varchar类型在mysql处理上简单的多,用int类型来存储时间是一个非常好的选择。
  3. 尽可能的使用not null来定义字段。
    这是因为innodb的一些特性所决定的,对于一些为null的字段,他可能需要一些额外的字段来进行存储,同时也会增加IO和存储的开销,所以在进行表结构设计的时候,尽量把每一个字段设计成not null,并且给出一个默认值。
  4. 尽量少的使用一些大的类型,比如:text类型
    如果非用不可的情况下,最好把这些字段单独提出来,存在一张附加表之中,一方面增加了主表的查询效率,另一方面在需要的时候对附加表进行这种大数据的查询。
    使用int类型来存储时间,利用FROM_UNIXTIME()和UNIX_TIMESTAMP()两个函数来进行转换。

如 FROM_UNIXTIME(1443922330,‘%Y-%m-%d’); 得到一个格式化的:年-月-日
UNIX_TIMESTAMP(‘2020-04-22’); 得到一个时间戳
使用bigint类型来存储ip地址,利用INET_ATON(),INET_NTOA()两个函数来进行转换

如 INET_ATON(‘127.0.0.1’) 返回一个整形

INET_NTOA(ip) 返回一个ip地址

存储ip地址除了使用varchar之外,还可以使用bigint类型存储,varchar来存储ip的话,大约需要15个字节,而bigint只需要8个字节,相差了7个字节,不要小看这7个字节,数据量很大的情况下,7个字节能给我们节省很大的存储空间,并且会给IO效率,内存带来很大的节约。能为重要的是,不仅仅在空间上有节约,在ip地址的对比上,也会有好处,因为整形对比要比varchar对比更简单,更高效。

范式优化

1NF
简单说:每列都是不可再分的最小数据单元
比如:Addess --> 国家+省+城市
姓名–>姓+名
2NF
条件: 首先必须满足第一范式
必须有一个(及以上)主键
非主键列 必须全部依赖于全部主键
3NF
必须满足2NF
非主键列必须直接依赖于主键,不能传递依赖

反范式优化

完全按照第三范式做表的设计可能会降低查询效率(涉及多表查询,多表连接JOIN,临时表创建GROUP BY)。
适当的合并一些表的字段(减少表的数量),产生一些字段冗余,有时候可以提高查询效率
空间来换取时间,减少join查询,(查询时减少时间)

数据表的拆分

垂直拆分
垂直拆分是指,将一个属性较多,一行数据较大的表,将不同的属性拆分到不同的表中,以降低单库(表)大小,达到提升性能的目的的方法,垂直切分后,各个库(表)的特点是:
(1)每个库(表)的结构都不一样
(2)一般来说,每个库(表)的属性至少有一列交集,一般是主键
(3)所有库(表)的并集是全量数据

水平拆分
水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。
水平拆分的优点:
◆表关联基本能够在数据库端全部完成;
◆不会存在某些超大型数据量和高负载的表遇到瓶颈的问题;
◆应用程序端整体架构改动相对较少;
◆事务处理相对简单;
◆只要切分规则能够定义好,基本上较难遇到扩展性限制;

水平切分的缺点:
◆切分规则相对更为复杂,很难抽象出一个能够满足整个数据库的切分规则;
◆后期数据的维护难度有所增加,人为手工定位数据更困难;
◆应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难。

MyCat

MyCat是目前最流行的基于Java语言编写的数据库中间件,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分库分表。配合数据库的主从模式还可实现读写分离。

MyCat是基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MyCat变得非常的强大。

MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

MyCAT的目标是:低成本的将现有的单机数据库和应用平滑迁移到“云”端,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。从这一点介绍上来看,能满足数据库数据大量存储,提高了查询性能。MyCat在大数据方面的运用不容小觑啊。

MyCAT特性
支持 SQL 92标准
支持Mysql集群,可以作为Proxy使用
支持JDBC连接ORACLE、DB2、SQL Server,将其模拟为MySQL Server使用
支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性数据分片集群
自动故障切换,高可用性
支持读写分离,支持Mysql双主多从,以及一主多从的模式
支持全局表,数据自动分片到多个节点,用于高效表关联查询
支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询
多平台支持,部署和实施简单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值