`

Mysql-表的设计合理化

阅读更多

参考阅读: 58到家数据库30条军规解读

 

 

数据库的表结构设计往往会影响应用后期的性能,特别是用户量上来了以后的性能:

1.符合3NF
表的范式,是首先符合1NF, 才能满足2NF , 进一步满足3NF
1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只有数据库是关系型数据库(mysql/oracle/db2/informix/sysbase/sql server),就自动的满足1NF
2NF: 表中的记录是唯一的, 就满足2NF, 通常我们设计一个主键来实现,主键一般不含业务逻辑,设置为自增长
3NF: 即表中不要有冗余数据, 就是说,表的信息,如果能够被推导出来,就不应该单独的设计一个字段来存放. 比如下面的设计就是不满足3NF:
反3NF : 但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是: 在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

在表的1对N的情况下,为提高效率,可能会在1这表中设计字段提速

2.字符集
一般来说尽量选择UTF-8
虽然在存储的时候GBK比UTF-8使用的存储空间少,但是UTF-8兼容各国语言,其实我们不必为了这点存储空间而牺牲了扩展性。
事实上,后期如果要从GBK转为UTF-8所要付出的代价是很高的,需要进行数据迁移,而存储空间完全可以用花钱扩充硬盘来解决。

3.主键
在使用mysql的innodb的时候,设计表的时候需要: 增加一个主键,而且最好要自增。
对于插入:
因为自增主键可以让插入的数据按主键顺序插入到底层的B+树的叶子节点中,由于是按序的,这种插入几乎不需要去移动已有的其它数据,所以插入效率很高。
如果主键不是自增的,那么每次主键的值近似随机,这时候就有可能需要移动大量数据来保证B+树的特性,增加了不必要的开销。
对于查询:
原因是innodb的底层存储模型是B+树,它使用主键作为聚簇索引,使用插入的数据作为叶子节点,通过主键可以很快找到叶子节点,从而快速获取记录

4.字段
(1)只含数值信息的字段只使用数字型字段
若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了
(2) 存储小数,建议使用decimal,
不建议使用float、double来存小数,会损失精度
(3)尽量使用varchar/nvarchar 代替 char/nchar 首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。其次,varchar类型长度,建议不要超过8K。
在设计长度时,括号里的数字尽可能少,除了需要进行填充
(4)时间类型建议使用Datetime,
不要使用timestamp,虽然Datetime占用8个字节,而timestamp只占用4个字节,但是后者要保证非空,而且后者是对时区敏感的。
(5)保存大量数据,建议将大文本数据保存在专门的文件存储系统中,mysql中只保存这个文件的访问地址,比如博客文章可以保存在文件中,mysql中只保存文件的相对地址,不建议使用Text/blob来保存大量数据,因为对大文本的读写会造成比较大的I/O开销,同时占用mysql的缓存,高并发下会极大的降低数据库的吞吐量
(6) 在设计字段时,建议字段必须加上not null约束,并且设置default值,尤其是索引字段和查询条件必须设置
(7) 建议表中增加gmt_create和gmt_modified两个字段,用来记录数据创建的修改时间。这两个字段建立的原因是方便查问题。

分享到:
评论

相关推荐

    mysql-udf-http

    因此,使用时需要注意数据过滤和验证,同时,频繁的网络请求可能影响数据库性能,合理设计和优化请求策略至关重要。 8. **应用场景**:"mysql-udf-http" 在实时数据分析、集成外部 API、触发外部服务等方面有广泛的...

    mysql-5.5.61-winx64 \mysql-5.5.36-win32\mysql-essential-5.1.32-win32

    - MySQL的性能可以通过调整各种系统变量、优化查询语句、合理设计索引等方式提升。例如,使用EXPLAIN分析查询计划,优化JOIN操作,合理使用索引等。 8. **最新版本与社区支持**: - 虽然提供的版本较旧,但MySQL...

    mysql-connector-java-8.0.24

    MySQL Connector/J 8.0.24 是MySQL数据库与Java应用程序之间的重要桥梁,它是一个用于连接Java...最后,了解并遵循MySQL的最佳实践,如合理设计数据库架构、索引管理和事务处理,有助于提升整个系统的稳定性和效率。

    mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

    这个压缩包文件"mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz"包含了MySQL服务器的5.7.17版本,专为运行在Linux系统上(基于glibc2.5库)的x86_64架构设计。在这个版本中,MySQL引入了许多性能优化和新特性,使得它...

    MySQL驱动 mysql-connector-net-6.1.6

    在实际项目中,合理利用MySQL驱动mysql-connector-net-6.1.6可以帮助开发人员快速构建高效、可靠的.NET应用程序,实现与MySQL数据库的无缝集成。通过深入理解和熟练运用其特性,可以提升开发效率,确保系统的稳定性...

    mysql-connector-java-5.1.46 只有两个jar包.zip

    此外,合理设计测试用例和负载模型对于评估系统性能和稳定性至关重要。记住,JMeter不仅仅用于压力测试,还可以进行功能测试、性能测试、负载测试和可靠性测试等多种测试类型,而`mysql-connector-java-5.1.46`作为...

    mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

    - 初始化:运行MySQL的初始化脚本,创建默认数据目录和系统表,例如`./scripts/mysql_install_db --user=mysql`。 - 设置权限:确保MySQL的启动脚本和数据目录具有正确的权限。 - 启动服务:使用`sudo service ...

    mysql-5.6.36-winx64.zip

    MySQL 5.6.36 是 MySQL 数据库管理系统的一个稳定版本,专为 Windows x64 操作系统设计。这个版本的 MySQL 提供了强大的数据库管理功能,包括优化的性能、增强的安全性和各种新特性,使其成为企业级应用的理想选择。...

    mysql-5.6.16-linux-glibc2.5-x86_64.tar.gz

    这个压缩包文件"mysql-5.6.16-linux-glibc2.5-x86_64.tar.gz"是专为Linux操作系统设计的MySQL 5.6.16版本的安装包。以下是关于MySQL 5.6.16以及在Linux环境下手动安装的详细知识要点: 1. **MySQL版本**: MySQL ...

    mha4mysql-master和mha4mysql-node

    而MHA(Master High Availability)正是针对这一需求设计的工具,它为MySQL主从集群提供了高效且自动化的故障切换解决方案。 **1. MySQL主从复制** MySQL主从复制是一种异步复制机制,主要分为三个角色:主服务器...

    mysql-essential-6.0.11-alpha-winx64

    10. **性能优化**:通过调整配置参数、合理设计数据库架构、使用合适的索引等方式,可以显著提升MySQL的性能。 总之,"mysql-essential-6.0.11-alpha-winx64"提供了在64位Windows系统上运行MySQL所需的基本工具,让...

    mysql-5.7.21-linux-glibc2.12-x86_64.tar.gz 百.度.网.盘地址及密码

    - **索引优化**:合理设计和使用索引可以显著提高查询速度。 - **查询优化**:避免全表扫描,减少不必要的 JOIN 操作。 - **分区策略**:对于大数据量的表,采用合适的分区策略可以提高查询性能。 - **硬件升级**:...

    MySQL驱动 mysql-connector-net-6.4.0

    3. **最佳实践**:遵循数据库设计和编程的最佳实践,如合理使用索引、避免全表扫描、及时关闭连接等,以提升系统性能。 4. **升级与兼容性**:当MySQL数据库或.NET框架升级时,需确认驱动程序是否兼容,如有必要,...

    mysql-installer-community-5.7.12.0.zip

    2. 数据库设计时,合理规划表结构和索引,避免全表扫描,以提高查询效率。 3. 定期备份数据库,以防数据丢失,同时监控服务器性能,及时调整参数配置。 4. 使用最新版本的MySQL客户端库进行应用程序开发,以利用最新...

    mysql-standard-4.0.5-beta.tar.gz

    这可能涉及到调整查询语句、使用合适的数据类型、优化表设计、合理分配系统资源,以及使用工具如mysqldump进行备份和恢复。 总的来说,"mysql-standard-4.0.5-beta.tar.gz"是一个包含了MySQL早期版本的压缩包,它...

    mysql-5.6.13.tar.gz

    - 初始化数据库:运行`scripts/mysql_install_db`初始化数据目录和系统表。 - 设置权限:修改`my.cnf`配置文件,设置用户权限和服务器参数。 - 启动服务:使用`sudo service mysql start`启动MySQL服务。 3. **...

    mysql-noinstall-5.1.45-winx64.zip

    "mysql-noinstall-5.1.45-winx64.zip"是一个为Windows 64位操作系统编译的MySQL安装包,它不包含图形化的安装向导,而是通过命令行进行安装和配置。 1. **无安装版**: "noinstall"意味着这是一个便携式或免安装版本...

    MySQL驱动 mysql-connector-net-6.8.0

    3. 实例化MySqlConnection对象并打开连接。 4. 创建并执行DbCommand对象,用于执行SQL命令。 5. 处理结果集,例如通过DbDataReader对象读取数据。 6. 完成操作后关闭连接,释放资源。 在实际开发中,开发者还需要...

    mysql-5.7.18-winx64.zip

    标题“mysql-5.7.18-winx64.zip”表明这是MySQL的5.7.18版本,专为64位Windows操作系统设计的安装包。zip文件格式意味着它是一个压缩文件,需要解压后才能进行安装和使用。 描述中的"MySOL"可能是"MySQL"的打字错误...

    mysql-5.7.41.tar.gz

    - **JOIN操作**:避免全表扫描,合理设计JOIN条件,使用EXPLAIN分析查询执行计划。 - **慢查询日志**:开启慢查询日志,找出执行时间过长的SQL语句进行优化。 7. **备份与恢复** MySQL提供多种备份策略,如`...

Global site tag (gtag.js) - Google Analytics