数据库物理设计

物理设计

物理设计就是根据所选择的关系型数据库的特点对逻辑模型进行存储结构设计。它涉及的内容包含以下4方面:1. 定义数据库、表及字段的命名规范;2. 选择合适的存储引擎;3. 为表中的字段选择合适的数据类型;4. 建立数据库结构。

定义数据库、表及字段的命名规范

  • 数据库、表及字段的命名要遵守可读性原则

  • 数据库、表及字段的命名要遵守表意性原则

  • 数据库、表及字段的命名

存储引擎

  • MyISAM存储引擎是非事务的,锁粒度是表级的,主要应用于select,insert,不适合应用于读写操作频繁的场景,因为对于读写操作会进行锁表操作。
  • MRG_MYISAM和MyISAM差不多
  • Innodb存储引擎是支持事务,支持MVCC行级锁,适合任何场景
  • Archive存储引擎不支持事务,支持行级锁,支持insert、select,适用于随机读取、更新、删除。
  • Ndb Cluster是MySQL集群存储引擎 ,支持事务,支持行级锁,具有高可用性

数据类型

原则:当一个列可以选择多种数据类型时,应该优先考虑数值类型,其次是日期或二进制类型,最后是字符类型。对于相同级别的数据

类型,应该优先选择占用空间小的数据类型。

1. 数值类型

数值类型可以分为整数类型和实数类型。

image.png

其中,M表示整数类型的最大显示宽度; 对于浮点和定点类型,M是可以存储的总位数(精度);对于字符串类型,M是最大长度。 M

的最大允许值取决于数据类型。注意:当我们只存储两位数时,一种错误用法就是int(2),其实int(i)存储空间是由数据类型和是否是

unsigned决定的,i只是表示显示长度。int(11)和int(1)的存储空间是没差别的, int(11)的数据长度如果小于11,则默认补充空格,如果

int (11)字段被zerofill修饰,则默认补充0,而且字段被zerofill修饰会自动添加unsigned。因此,当我们只存储两位数时,使用tinyint才能

达到我们简约空间的目的。

注意:Decimal类型是精确类型的,如果我们需要存储精确数据,例如财务数据就必须使用Decimal类型,而不能使用float和double类型。

2. 字符串类型

字符串类型中有两种类型:char和varchar。
image.png

varchar(n)的存储规范
  • varchar存储变长内容,varchar需要额外的空间记录内容长度,当内容小于255字节时,需要一个额外字节,当内容大于255字节时,需要2个额外字节;

  • 在jbk编码下,char占2个字节,在UTF-8编码下,char占用3个字节;

  • MySQL每行最多存储65535个字节;

  • varchar中的第1个字节表示是否为空,第二个字节和第3个字节表示长度,剩下字节表示实际内容,因此最大可用存储65535-1-2=65532 ;

create table t1(c varchar(n)) charset=gbk,则此处n的最大值为(65535-1-2)/2=32766

create t(c int ,c2 char(30),c3 varchar(n)) charset=utf8,则此处n的最大值(65535-1-2-4-90)/3=21812

* varchar(100)中的100指的是100个字符数量;

  • 使用场景:字符串列的最大长度比平均长度大很多字符串列很少被更新,由于varchar类型长度不固定,那么进行更新时,可

能导致存储页的分裂,引起存储碎片;使用多字节字符集存储字符串,以UTF-8为例,存储中文需要3个字节,而存储英文或数字只需

要1个字节。

char(n)的存储规范
  • char类型是定长的;

  • 字符串存储在char类型的列中会删除末尾的空格(见下图);

  • char类型的最大宽度是255字节。

  • 适用场景: char类型适合存储长度近似的值,例如身份证、md5值,手机号等;char类型适合存储短字符串,例如性别字段,

使用char(1)就比varchar(1)更节省空间,因为varchar还需要存储额外字节存储其他信息;char类型适合存储经常更新的字符序列

由于char类型的长度是固定的,MySQL会一次性地分配存储空间,在多次更新时也不会出现页分裂的情况,减少存储碎片。

image.png

3. 日期类型

image.png

注意:timestamp占4byte,实际上是用int存储的。由于只有4byte,因此它只能显示1970-01-01 到 2038-01-19,也正是这个原因,如

果在这个时间内的字段推荐使用timestamp。timestamp类型显示依赖于所指定的时区。除此之外,还需要注意一点,**在行的数据

修改时可以自动修改timestamp列的值**,这个特性可以帮助我们在进行数据分析时自动提取出最新变化的数据。

MySQL5.5 datetime类型字段不能设置默认值为now()

MySQL5.6 datetime类型字段可以设置默认值为now()

  • from_unixtime():数字转换成时间

  • unix_timestamp():时间转换成数字

  • Date_sub/DATE_ADD:对时间进行加减

  • CURDATE():将当前日期按照’YYYY-MM-DD’

  • NOW():返回当前日期和时间值

建立数据库结构

1. DML(Data manipulation language,数据操作语言)
  • DML分成数据查询和数据更新两类,数据更新又分成插入、删除和修改三种操作,主要命令:select、insert、delete、update、merge、call、explain、plan
2. DDL(Data definition language,数据定义语言)
  • DDL包括两种类型数据:数据字典以及数据类型和结构定义。主要命令:create 、alter、drop、truncate、rename、comment
  • Create,用于创建语句,用于创建表或者数据库或者存储过程或者其他内容
create table tea(id int not null auto_increment,name varchar(6) not null,remark char(6),primary key(id));
show create table tea;
  • Alter,一般用于添加或者修改表中的字段名或者字段定义。也可以用于修改字段顺序等。同样的也可以用于修改数据库的名字或者编码
修改字段定义:
ALTER TABLE emp MODIFY first_name VARCHAR(20) NOT NULL DEFAULT '-';  
添加字段:
alter table emp add column age int(3) not null default 0;  
修改字段名字,同时修改定义:
alter table emp change age age1 int(4) not null default 0;  
在表Column的尾部追加新的column:
alter table emp add birth date not null after empno;  
移动column到表column的首位:
alter table emp modify age1 int(3) not null default 0 first;  
将某个column移动到另一个columon后面:
alter table department change deptno deptno int(11) NOT NULL after deptname;  
删除主键:
alter visit_log drop primary key;  
修改表名:
alter table emp rename employees; 
删除字段
alter table guess_product_info  drop column backstyle;
3. DCL(Data Control Language,数据控制语言)
  • 设置或更改数据库用户或角色权限,包括对基本表和视图的授权,完整性规则的描述,事务控制等内容。
  • grant
赋予权限
grant all privileges on *.* to 'root'@'localhost' with grant option; 授权远程用户注意不要with grant option
grant select,update,create,delete on *.* to guest@'115.220.46.%' identified by 'test@home';创建业务用户,并要求只限制IP段
查看权限
Select user,password,host from mysql.user;
Show grants for root@'localhost';
select user,password,host ,grant_priv,super_priv from mysql.user;
重命名用户
rename mysql.user root@' ' to admin@' ';
刷新权限
flush privileges
回收权限
revoke select,insesrt,update,delete,create on *.* from 'guest'@'115.220.46.%';
show grants for guest@'115.220.46.%';
修改密码
update mysql.user set password =password('test') where user='guest';password()函数对字符串进行MD5加密
mysqladmin -uroot -ptest password 12345
                                    -p 旧密码  password 新密码

忘记密码
mysqld_safe --defaults-file=/etc/mysql/my3306.cnf --skip-grant-tables &
删除用户
drop user root@'';
删除test数据库
select * from mysql.db where db like '%test%'\G;
delete from mysql.db where db like '%test%';
删除不需要的用户

mysql> select user,password,host from mysql.user;
+------+-------------------------------------------+------------+
| user | password                                  | host       |
+------+-------------------------------------------+------------+
| root |                                           | localhost  |
| root |                                           | nbview.com |
| root |                                           | 127.0.0.1  |
| root |                                           | ::1        |
|      |                                           | localhost  |
|      |                                           | nbview.com |
| kewy | kewy126@home                              | %          |
| root | *08F411191A8F7130F09F0A961DB8E87983620D5B | %          |
+------+-------------------------------------------+------------+
8 rows in set (0.00 sec)
mysql> delete from mysql.user where user='kewy';
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    59
Current database: student_db1
Query OK, 1 row affected (0.01 sec)
mysql> delete from mysql.user where user='root' and host='::1';
Query OK, 1 row affected (0.00 sec)
mysql> delete from mysql.user where user='root' and host='nbview.com';
Query OK, 1 row affected (0.00 sec)
mysql> delete from mysql.user where host='nbview.com';
Query OK, 1 row affected (0.00 sec)

mysql> delete from mysql.user where host='localhost' and user is null;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from mysql.user where host='127.0.0.1' ;
Query OK, 1 row affected (0.00 sec)
mysql> select user,password,host from mysql.user;
+------+-------------------------------------------+-----------+
| user | password                                  | host      |
+------+-------------------------------------------+-----------+
| root |                                           | localhost |
| root | *08F411191A8F7130F09F0A961DB8E87983620D5B | %         |
+------+-------------------------------------------+-----------+
2 rows in set (0.00 sec)
4. TCL(Transaction Control Language,事务控制语言)
  • TCL用于控制事务内执行流程的语言
  • start transaction|Begin:开始一个事务
  • Savepoint:创建一个记录点,方便回滚到这个地方
  • Rollback:回滚事务
  • Commit:提交事务
开始事务
START TRANSACTION  
可选:创建一个存档点
SAVEPOINT sp  
开始操作SQL
select  
insert  
...
操作完成提交数据
COMMIT  
或者,操作失败,回滚数据(回滚到某个存档点)
ROLLBACK  
ROLLBACK TO sp  
释放存档点
RELEASE SAVEPOINT sp  

总结

在进行数据库物理设计时,我们需要计算每张表的存储空间, 选择存储引擎和表中的数据类型。


image

欢迎关注微信公众号:木可大大,所有文章都将同步在公众号上。

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库物理设计(1)全文共2页,当前为第1页。数据库物理设计(1)全文共2页,当前为第1页。物理结构设计 数据库物理设计(1)全文共2页,当前为第1页。 数据库物理设计(1)全文共2页,当前为第1页。 数据库物理设计阶段的任务是根据具体计算机系统(DBMS和硬件等)的特点,为给定的数据库模型确定合理的存储结构和存取方法。所谓的"合理"主要有两个含义:一个是要使设计出的物理数据库占用较少的存储空间,另一个对数据库的操作具有尽可能高的速度。 为了设计数据库物理结构,设计人员必须充分了解所用DBMS的内部特征;充分了解数据系统的实际应用环境,特别是数据应用处理的频率和响应时间的要求;充分了解外存储设备的特性。数据库物理结构设计大致包括:确定数据的存取方法、确定数据的存储结构。 物理结构设计阶段实现的是数据库系统的内模式,它的质量直接决定了整个系统的性能。因此在确定数据库的存储结构和存取方法之前,对数据库系统所支持的事务要进行仔细分析,获得优化数据库物理设计的参数。 对于数据库查询事务,需要得到如下信息: l 要查询的关系。 l 查询条件(即选择条件)所涉及的属性。 l 连接条件所涉及的属性。 l 查询的投影属性。 对于数据更新事务,需要得到如下信息: l 要更新的关系。 l 每个关系上的更新操作的类型。 l 删除和修改操作所涉及的属性。 l 修改操作要更改的属性值。 上述这些信息是确定关系存取方法的依据。除此之外,还需要知道每个事务在各关系上运行的频率,某些事务可能具有严格的性能要求。例如,某个事务必须在20秒内结束。这种时间约束对于存取方法的选择有重大的影响。需要了解每个事务的时间约束。 值得注意的是,在进行数据库物理结构设计时,通常并不知道所有的事务,上述信息可能不完全。所以,以后可能需要修改根据上述信息设计物理结构,以适应新事务的要求。 1. 确定关系模型的存取方法 确定数据库的存取方法,就是确定建立哪些存储路径以实现快速存取数据库中的数据。现行的DBMS一般都提供了多种存取方法,如索引法、HASH法等。其中,最常用的是索引法。 数据库物理设计(1)全文共2页,当前为第2页。数据库物理设计(1)全文共2页,当前为第2页。数据库的索引类似书的目录。在书中,目录允许用户不必浏览全书就能迅速地找到所需要的位置。在数据库中,索引也允许应用程序迅速找到表中的数据,而不必扫描整个数据库。在书中,目录就是内容和相应页号的清单。在数据库中,索引就是表中数据和相应存储位置的列表。使用索引可以大大减少数据的查询时间。 数据库物理设计(1)全文共2页,当前为第2页。 数据库物理设计(1)全文共2页,当前为第2页。 但需要注意的是索引虽然能加速查询的速度,但是为数据库中的每张表都设置大量的索引并不是一个明智的做法。这是因为增加索引也有其不利的一面:首先,每个索引都将占用一定的存储空间,如果建立聚簇索引(会改变数据物理存储位置的一种索引),占用需要的空间就会更大;其次,当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的更新速度。 在创建索引的时候,一般遵循以下的一些经验性原则: l 在经常需要搜索的列上建立索引。 l 在主关键字上建立索引。 l 在经常用于连接的列上建立索引,即在外键上建立索引。 l 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的。 l 在经常需要排序的列上建立索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询的时间。 l 在经常成为查询条件的列上建立索引。也就是说,在经常使用在WHERE子句中的列上面建立索引。 同样,对于某些列不应该创建索引。这时候应该考虑下面的指导原则: l 对于那些在查询中很少使用和参考的列不应该创建索引。因为既然这些列很少使用到,有索引并不能提高查询的速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 l 对于那些只有很少值的列不应该建立索引。例如,人事表中的"性别"列,取值范围只有两项:"男"或"女"。若在其上建立索引,则平均起来,每个属性值对应一半的元组,用索引检索,并不能明显加快检索的速度。 时刻怀有一颗虔诚之心,乐于分享。知识才更有意义。 数据库物理设计(1)
数据库物理设计是指将逻辑模型转化为可在计算机上存储和查询的物理结构的过程。在进行数据库物理设计时,有几个重要的原则需要遵循。 首先,合理的数据分布是数据库物理设计的关键原则之一。合理的数据分布可以提高查询性能并减少存储空间的浪费。例如,将经常一起查询的数据存储在相邻的磁盘块或表空间中,可以减少磁盘IO的次数,从而提高查询速度。 其次,索引的设计也是数据库物理设计的重要原则之一。索引可以加快数据的检索速度,但同时也会增加数据的存储空间。因此,在设计索引时需要权衡查询性能和存储空间的消耗。 另外,冗余数据的最小化也是数据库物理设计的原则之一。冗余数据指的是在数据库中存储相同信息的多个副本。冗余数据不仅会增加存储空间的占用,还会导致更新操作的复杂性和数据一致性的问题。因此,在进行数据库物理设计时,需要尽量避免冗余数据的产生。 此外,合理选择数据类型也是数据库物理设计的原则之一。不同的数据类型在存储空间的占用和查询性能方面有所区别。因此,在进行数据库物理设计时,需要根据实际需要选择合适的数据类型,以提高存储效率和查询性能。 综上所述,数据库物理设计的原则包括合理的数据分布、适当的索引设计、最小化冗余数据和合理选择数据类型等。这些原则在实际的数据库设计中非常重要,可以提高数据库的性能和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值