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. 16.1112 模拟考试 T1

    加密[问题描述]有一种不讲道理的加密方法是: 在字符串的任意位置随机插入字符. 相应的,不讲道理的解密方法就是从字符串中恰好删去随机插入的那些字符.给定原文s和加密后的字符串t,求?有多少子串可以通过 ...

  2. 品酒大会 BZOJ 4199

    品酒大会 [问题描述] [输入格式] [输出格式] [样例输入] 10ponoiiipoi 2 1 4 7 4 8 3 6 4 7 [样例输出] 45 56 10 56 3 32 0 0 0 0 0 ...

  3. CSS参数介绍

    原文发布时间为:2008-08-03 -- 来源于本人的百度文章 [由搬家工具导入] 行高       line-height: 16px 宽度       (具体位置)-width: 16px 文字 ...

  4. Codeforces Round #291 (Div. 2) D. R2D2 and Droid Army [线段树+线性扫一遍]

    传送门 D. R2D2 and Droid Army time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  5. spring-boot-nginx代理-docker-compose部署

    在本地测试,使用docker部署不用在意环境 java测试项目: web框架:spring boot 框架 项目管理:maven 数据库:redis + postgres + mongo 部署相关:n ...

  6. POJ 3080 多个串最长公共子序列

    求多个串最长公共子序列,字典序最小输出.枚举剪枝+kmp.比较简单,我用find直接查找16ms #include<iostream> #include<string> #in ...

  7. let与const命令

    (需要注意的地方) 1.ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. 2.for循环还有一个特别之处,就是设置循环变量的那部分是一 ...

  8. Python学习系列之logging模块

    实例一:日志写进一个文件 代码: import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filen ...

  9. uml精粹——10.状态机图

    10.状态机图state machine diagram   状态机图是常见的描写叙述一个系统行为的技术. 在面向对象的方法中,为单个类绘制一个状态机图来展示单个对象的生命周期行为. 见图10.1 图 ...

  10. lua 异常 错误处理 pcall

    lua 错误处理 匿名函数 if pcall(function () local s=object.data[1]['type'] end) then return object.data[1]['t ...