1.过分的反范式化为表建立太多的列

  我们在设计数据库的结构时,比较容易犯的第一个错误就是对表进行了过分的反范式化的设计,这就容易造成了表中的列过多,虽然说Mysql允许为一个表建立很多的列,但是由于Mysql的插件式架构的原因,前面博客已经有介绍,Mysql的服务器层和存储引擎层是分离的,Mysql的存储引擎API工作时需要把服务器层和存储引擎层之间通过缓冲格式来拷贝数据,然后在服务器层将缓冲层的数据解析成各个列,这个操作过程成本是非常高的,特别是对于MyISAM的变长结构,和Innodb这种行结构在解析时还必须进行转换,这个转换的成本呢就依赖于列的数量,所以,如果一个表的列过多,在使用这个表时就会带来额外过多的cpu消耗。所以在进行表设计的时候一定要注意,不要把表相关的所有列都放在一个表中,而是要按照范式化适当的对表进行拆分,关于什么是范式化,会另外的详细介绍。

2.过分的使用范式化设计造成了太多的表关联

  对数据库的设计过分的使用了范式化设计的思路,对于任何的查询都要关联很多个表,通过前面的介绍,我们知道对Mysql进行表关联查询成本是非常高的,而且性能也会随着关联表的增加而下降,所以呢Mysql对表关联的数量进行了限制,Mysql最多只可以关联61个表,这个限制呢虽然对于大多数应用来说已经足够了,但是我们为了Mysql的性能还是要尽量减少关联的表,关联的表数量最好在10个以内,这就要求我们在进行数据库设计时候要进行适当的反范式化设计,把经常使用的两个小表合成一个大表,这样做对提升数据库的性能和sql查询的性能都是很有帮助的 。

3.在OLTP环境中使用不恰当的分区表

  分区表是一个好东西,可以帮助我们把一个大表在物理存储上按照分区键分成多个小表,这里要注意了,分区表和我们常说的分库分表是有区别的,分区表是在同一个数据库实例下进行的,而物理存储上分成多个小表但是在使用时逻辑上还是使用一个表;而分库分表所要做的操作不止是在物理上进行拆分而且逻辑上也会拆分多个表,而且分库分表后多个表通常不是在一个数据库实例下的。在使用分区表时,分区键的选择非常关键,如果分区键的选择不恰当,就会造成查询时跨多个分区查询,这样不仅不会提升数据库的性能,而且还会降低数据库的查询性能,所以建议在OLTP环境中使用分区表一定要注意,分区表最好还是在OLAP环境使用,或者对于一些日志表使用还是比较合适的。

4.使用外键约束保证事务的完整性

   我们都知道InnoDB存储引擎是事务型存储引擎,它是支持事务和外键的,所以很多开发人员喜欢使用外键约束来保证数据的完整性,但是这样的效率是非常低的,因为在对使用外键的表进行修改时,Mysql都会对外键约束来进行检查,这样呢就带来了额外的锁的开销,降低了数据库修改的效率;另外使用外键,在进行数据库备份、恢复或者手动进行数据归档维护也会有问题,比如:我们不能使用truncate table对表快速的进行清空操作, 只能使用delete from进行,这样在主从复制的环境下对一个大表的数据环境清理复杂度就会变得很高,所以强烈建议不要使用外键约束,但是在关联键上建立相关的索引还是必须的

MySQL数据库设计常犯的错以及对性能的影响的更多相关文章

  1. Django 连接 MySQL 数据库及常见报错解决

    目录 Django 连接 MySQL数据库及常见报错解决 终端或者数据库管理工具连接 MySQL ,并新建项目所需数据库 安装访问 MySQL 的 Python 模块 Django 相关配置 可能会遇 ...

  2. 惊呆了!Java程序员最常犯的错竟然是这10个

    和绝大多数的程序员一样,我也非常的宅.周末最奢侈的享受就是逛一逛技术型网站,比如说 programcreek,这个小网站上有一些非常有意思的主题.比如说:Java 程序员最常犯的错竟然是这 10 个, ...

  3. mySql 数据库设计原则

    mysql数据库设计原则: 必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 禁止使用存储过程.视图.触发器.Event 解读:高并发大数据 ...

  4. 在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as c rashed and should be repaired when using LOCK TABLES

    在给mysql数据库备份时,报错: mysqldump: Got error: 145: Table '.\shengdaxcom\pre_forum_thread' is marked as cra ...

  5. mysql数据库设计规则总结

    MySQL数据库设计总结   规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的 ...

  6. MySQL 数据库设计的“奥秘”

    2 MySQL 数据库设计的"奥秘" [主题]逻辑设计:数据类型与 Schema 所谓"万丈高楼平地起",一个稳固的建筑离不开扎实的基础.同样,良好的的「逻辑设 ...

  7. mysql 数据库设计(转)

    本规范适用于mysql 5.1或以上版本使用 数据库范式 第一范式(1NF)确保每列保持原子性 第一范式(1NF):数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项. ...

  8. MYSQL数据库设计之字段选择原则

    关于字段的选择其实很多地方都有进行详细的介绍,我这里只写一下我在使用过程中的心得感受.如果想要全面的了解的话,大家可以去看高性能MYSQL这一本书籍,里面有一章节介绍的特别全面,基本涉及MYSQL中全 ...

  9. MySQL数据库设计与开发规范

    目录 1. 规范背景与目的 2. 设计规范 2.1. 数据库设计 2.1.1. 库名 2.1.2. 表结构 2.1.3. 列数据类型优化 2.1.4. 索引设计 2.1.5. 分库分表.分区表 2.1 ...

随机推荐

  1. uva 10870 递推关系矩阵快速幂模

    Recurrences Input: standard input Output: standard output Consider recurrent functions of the follow ...

  2. javascript 日期处理类库 moment.js

  3. AnyChart创建实时仪表

    AnyChart创建实时仪表 简述: AnyChart是一款基于Flash和HTML5的图表.仪表控件,所包含的图表类型众多和跨平台以及跨浏览器是该产品的主要特点和优点,另外该产品基于XML文件作为数 ...

  4. linux的at定时任务的使用

    linux的at定时任务的使用 使用at只能执行一次性任务:使用at命令需要开启atd进程. 以下情况需要安装at命令: 情况1.查看是否开启atd进程:ps -ef | grep atd.[test ...

  5. Mybatis resultMap空值映射问题

    参考博客:https://www.oschina.net/question/1032714_224673 http://stackoverflow.com/questions/22852383/how ...

  6. android的系统学习

    先从Android的应用开发开始,等到对应用掌握的比较熟悉了,开始慢慢阅读一些Android 应用框架层的源代码,然后再渐渐往下去了解Android的JNI.Libraries.Dalvik虚拟机.H ...

  7. Jetson TK1 三:项目相关安装

    ROS.QT.pyserial2.7.罗技手柄驱动.navigation.slam和rviz等 激光雷达IP设置,tk1对应的IP设置,tk1串口设置 一.安装ros参见官网 二.安装QT 百度QT官 ...

  8. 配置maven从私服上下载构件

    maven 本地setting.xml配置 <!--配置maven从私服上下载构件 --> <profiles> <profile> <repositorie ...

  9. [Unit Testing] Fundamentals of Testing in Javascript

    In this lesson, we’ll get the most fundamental understanding of what an automated test is in JavaScr ...

  10. bsp开发之驱动开发

    驱动程序是可以管理虚拟设备或者物理设备,协议,服务等得软件模块,操作系统仅仅有通过驱动程序才干訪问硬件.针对windows ce开发设备驱动.就是通过platform builder创建一个新的平台, ...