MySQL 之 表设计注意事项

MySQL表设计好与坏直接关系到性能优化之根本,一般表的设计为了维护简单减少存储等因素都会遵循范式化的规则,为了查询效率我们一般都会有一些数据冗余,就会用到反范式化的设计,网上也有很多这方面的介绍,这里就不过多的解读了。

表字段类型直接关系数据的存储及查询效率,下面列举一些注意事情(引擎默认为innodb):

1、选择合适的字段类型,例如一个status状态字段,一般而言只会存在0、1、2几个不同值,我们可以使用tinyint绝不使用int,int占用空间为tinyint的四倍。又比如性别字段以中文男女分别时可以定义为enum类型,对查询效率有提升

2、字符类型选择合适的长度:

char:定长字符类型,例如一个name字段设计为char(10),无论存储1个还是10个字符,在磁盘及内存中都会分配10个字符的空间做存储

varchar:可变长字符类型,but只是对磁盘存储而言为可变长度,内存中依然按照设计时所给的字符长度分配空间

假如一个字段不长且能固定长度的使用char比varchar效率更高。

3时间类型字段选择: datetime占用6字节,timestamp占用4字节

4、选择顺序增长并且长度不大的整型字段做主键,MySQL乃索引组织表,数据和主键索引存在于一个数据页上,并且辅助索引都存在主键值,主键长度小有利于减少磁盘存储空间提高扫描速度,B+tree索引都是按顺序存储,设计主键为增长类型可以有效的降低数据页分裂,提高扫描速度。

5、保持每个字段不为null,采用默认值或者空字符代替,null在存储时为标识符,在做扫描时会对null进行计算增加开销。

6、除去text、blob等长字符类型的字段数据一行数据最多只能有65535字节长度的数据

7、一行数据长度加主键索引长度尽量不能超过8K,B-tree索引原则一页最少存储两条数据保持平衡,如果查过8K的长度,就会发生部分数据溢出的情况,降低查询效率。

8、慎用长字符类型字段:

compact:行格式为compact时长字符类型字段聚集索引页只存储前768字节数据,其余部分存于一个溢出页

dynamic:行格式为该选项并且innodb_file_format=Barracuda时,当不合适存储全部数据于聚集索引页时,只存储20字节的指针,指向数据存放的溢出页

不管是varchar的长类型或者是text、blob等的长字符类型,两个字段之间的溢出页不能共享,这样使得一个有多个长字符类型的表,在做字段查询时效率大大降低。

时间: 2024-08-08 13:45:23

MySQL 之 表设计注意事项的相关文章

mysql创建表的注意事项

1 库名,表名,字段名必须使用小写字母,"_"分割. 2 库名,表名,字段名必须不超过12个字符. 3 库名,表名,字段名见名识意,建议使用名词而不是动词. 4 建议使用InnoDB存储引擎.( InnoDB:支持事务安全的引擎,支持外键.行锁.事务是他的最大特点.如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况.) 5 存储精确浮点数必需使用DECIMAL替代FLOAT和DOUBLE.( float,double容易产生误差,对精确度

Mysql学习总结(17)——MySQL数据库表设计优化

1.选择优化的数据类型 MySQL支持很多种不同的数据类型,并且选择正确的数据类型对于获得高性能至关重要.不管选择何种类型,下面的简单原则都会有助于做出更好的选择: (1).更小通常更好 一般来说,要试着使用正确地存储和表示数据的最小类型.更小的数据类型通常更快,因为它们使用了更少的磁盘空间.内存和CPU缓存,而且需要的CPU周期也更少. 但是要确保不人低估需要保存的值,在架构中的多个地方增加数据类型的范围是一件极其费力的工作.如果不确实需要什么数据类型,就选择你认为不会超出范围的最小类型. (

MySQL数据表设计

1.数值类数据列类型 数据列类型 存储空间 说明 取值范围 TINYINT 1字节 非常小的整数 带符号值:-128~127 无符号值:0~255 SMALLINT 2字节 较小的整数 带符号值:-32768~32767 无符号值:0~65535 MEDIUMINT 3字节 中等大小的整数 带符号值:-8388608~8388607 无符号值:0~16777215 INT 4字节 标准整数 带符号值:-2147483648~2147483647 无符号值:0~4294967295 BIGINT

四 MySQL数据库表设计

一: 设计表: user:   ID,  PWD,  name,  type archiveRecord:     referdate,   archiveNum,   owner,   user,  status,   returndate. 二: 数据库操作接口实现: 新建用户:user表, 管理员类型可以增加,删除,修改 用户. 对archive表:  增加, 删除, 改 archive检索: 6个字段可以组合查询: 原文地址:https://www.cnblogs.com/liufei1

拎壶带你冲----教育类mysql用户表设计参考

说起用户表,大概是每个应用/网站立项动工(码农们)考虑的第一件事情.用户表结构的设计,算是整个后台架构的基石.如果基石不稳,待到后面需求跟进了发现不能应付,回过头来反复修改用户表,要大大小小作改动的地方也不少.与其如此,不妨设计用户表之初就考虑可拓展性,争取不需要太多额外代价的情况下一步到位. 先前设计 idusernamepassword用户名加上密码,解决简单需求,留个id作为其他表的外键.当然,那时候密码还可能是明文存储,好点的知道md5. 后来呢,随着业务需求的拓展,要加个用户状态 st

Mysql 获取表设计查询语句

SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, COLUMN_DEFAULT 默认值, COLUMN_COMMENT 备注 FROM INFORMATION_SCHEMA.COLUMNS where -- developerclub为数据库名称,到时候只需要修改成你要导出表结构的数据库即可 table_schema ='yjjy' AND

Auth模块、插拔式设计、BBS表设计

Auth模块 Auth模块是什么 Auth模块是Django自带的用户认证模块:因为我们会实现一些用户的登录.认证.注销等一些功能都需要先去验证,实现起来比较的麻烦.所以Django它默认的使用auth_user表来存储用户的数据. Auth模块常用方法 form django.contrib import auth # 导入auth模块 1.authenticate()认证 user = authenticate(usernmae='username',password='password')

mysql设计表时注意事项

说明:本文是对项目过程中的一些要求的简单汇总整理,主要是供个人本身参考... 一.表设计 1. 在创建表结构时,表名.字段需要见名知意,不采用拼音 create table  `tb_abc` (   `id` int(10) unsigned not null auto_increment comment  "此处写你的注释",   `name` varchar(50) not null comment '此处写你的注释', )engine=innodb default charse

mysql中的索引原理与表设计

索引是有效使用数据库的基础,但你的数据量很小的时候,或许通过扫描整表来存取数据的性能还能接受,但当数据量极大时,当访问量极大时,就一定需要通过索引的辅助才能有效地存取数据.一般索引建立的好坏是性能好坏的成功关键. 1.InnoDb数据与索引存储细节 使用InnoDb作为数据引擎的Mysql和有聚集索引的SqlServer的数据存储结构有点类似,虽然在物理层面,他们都存储在Page上,但在逻辑上面,我们可以把数据分为三块:数据区域,索引区域,主键区域,他们通过主键的值作为关联,配合工作.默认配置下