MySQL之数据库结构优化
1.选择合适的数据类型
一、选择能够存下数据类型最小的数据类型
二、可以使用简单的数据类型。int 要比varchar在MySQL处理上简单
三、尽可能的使用not null 定义字段
四、尽量少用txt类型,非用不可时考虑分表。
五、举例:
使用int类型存储日期时间,利用FROM_UNIXTIME(),UNIX_TIMESEAMP()两个函数转换
mysql> SELECT FROM_UNIXTIME(1234567890, '%Y-%m-%d %H:%i:%S');
+------------------------------------------------+
| FROM_UNIXTIME(1234567890, '%Y-%m-%d %H:%i:%S') |
+------------------------------------------------+
| 2009-02-14 07:31:30 |
+------------------------------------------------+
1 row in set (0.00 sec) mysql> SELECT UNIX_TIMESTAMP(2009-02-14 07:31:30);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use n
ear '07:31:30)' at line 1
mysql> SELECT UNIX_TIMESTAMP('2009-02-14 07:31:30');
+---------------------------------------+
| UNIX_TIMESTAMP('2009-02-14 07:31:30') |
+---------------------------------------+
| 1234567890 |
+---------------------------------------+
1 row in set (0.00 sec) mysql>
使用bigint存储IP地址,利用INET_ATON(),INET_NTOA()两个函数转换
mysql> select inet_aton('192.168.1.200');
+----------------------------+
| inet_aton('192.168.1.200') |
+----------------------------+
| 3232235976 |
+----------------------------+
1 row in set (0.00 sec)
mysql> select inet_ntoa(3232235976);
+-----------------------+
| inet_ntoa(3232235976) |
+-----------------------+
| 192.168.1.200 |
+-----------------------+
1 row in set (0.00 sec)
2.表的范式优化
一、标的范式化设计(符合三范式要求)
a:第一范式,每个属性不能拆分。
b:第二范式,含有主键。
c:不能存在非关键字的传递依赖,都必须依赖主键。
范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦。
二、表的反范式化
表的反范式是指为了查询效率的考虑吧原来符合第三范式的表适当的增加冗余,已达到优化查询的目的。反范式是一种以空间换取时间的操作。
举例:如我们现在要对一个 学校的课程表进行操作,现在有两张表,一张是学生信息student(a_id,a_name,a_adress,b_id)表,一张是课程表 subject(b_id,b_subject),现在我们需要一个这样的信息,把选择每个课程的的课程名称和学生姓名输出来:
SQL语句为:select B.b_id,B.b_subject,A_a_name from student A ,subject B;
当上面的数据量不多时,我们这样去查询没有问题;当我们的两张表的数据都是在百万级的时候,我们去查上面的信息, 问题出现了,这个查询动不动就是几百毫秒, 甚至更慢,这样的查询效率根本不能满足我们对于网页速度的要求。我们可以这样设计:在课程表里面添加冗余字段——学生姓名,这 样 我们就可以通过下面的查询 达到同样的目的:
SQL语句为:select b_id,b_subject,a_name from subject B;
这样的执行结果会在效率上面优化很多。可以通过SQL查询试试看。
3.表的垂直拆分
标的垂直拆分就是指把含有很多列的表拆分为多个表,这样就可以解决表的宽度问题。拆分原则如下:
一、不太常用的字段放到一个表中
二、把大字段独立的放到一个表中
三、把经常使用的字段放到一个表中
4.表的水平拆分
表的水平拆分是为了解决表中数据量大的问题,水平拆分的表每一个表结构都是完全一致的。
一、根据业务属性拆表
用业务属性拆表,业务关系复杂的情况下,如果要根据其他条件查询,其他的条件都必须和这个属性关联起来,查询条件必须带有这个属性。这种分表方式的算法 大致是取模,hash,md5等。
二、根据时间拆表
当表的关系比较复杂时,无法根据某个维度进行分表。但是有明显的时效性。
三、根据自增长ID拆表
这种分割法不是取模分,而是每张表存指定量的数据。如果数据量到了,就存放到新表中。这样可以完全控制每张表的数据量。关系非常简单并且有时效性的情况下 可以用。
四、数据迁移的方式
当一些很久之前的数据,很少再查询。比如员工工资表,我们可以只存今年的工资情况。而历史数据我们可以迁移到一张salary_old表中,保证数据不会丢失。但 也可以用来查询。
MySQL之数据库结构优化的更多相关文章
- MYSQL 数据库结构优化
数据库结构优化 优化数据大小 使表占用尽量少的磁盘空间.减少磁盘I/O次数及读取数据量是提升性能的基础原则.表越小,数据读写处理时则需要更少的内存,同时,小表的索引占用也相对小,索引处理也更加快速. ...
- MySQL系列(三)--数据库结构优化
良好的数据库逻辑设计和物理设计是数据库高性能的基础,所以对于数据库结构优化是很有必要的 数据库结构优化目的: 1.减少数据的冗余 2.尽量避免在数据插入.删除和更新异常 例如:有一张设计不得当的学生选 ...
- 《打造扛得住的MySQL数据库架构》第4章 MySQL数据库结构优化
4-1 数据库结构优化介绍 良好的数据库逻辑设计和物理设计是数据库获得高性能的基础. 1.减少不必要的数据冗余. 2.尽量避免数据维护中出现更新,插入和删除异常. 插入异常:如果表中的某个实体随着另一 ...
- mysql性能优化学习笔记(5)数据库结构优化
一.选择合适的数据类型 1.使用可存下数据的最小的数据类型 2.使用简单地数据类型,Int<varchar 3.尽可能使用not null定义字段 4.尽量少用text, ...
- 【MySQL优化】数据库结构优化
原则: 设计表结构,字段类型,最小化磁盘存储的空间,减少IO.数据库操作中最为耗时的操作就是 IO 处理,大部分数据库操作 90% 以上的时间都花在了 IO 读写上面.所以尽可能减少 IO 读写量,可 ...
- Mysql 性能优化5【重要】数据库结构优化
数据库设计的步骤 我们大多使用mysql 设计三范式 设置时区
- MySQL系列:性能优化
1. 优化简介 MySQL性能优化包括:查询优化.数据库结构优化.MySQL服务器优化等. 2. 查询优化 2.1 分析查询语句 MySQL提供EXPLAIN和DESCRIBE,用来分析查询语句. E ...
- 面试题: 数据库 sql优化 sql练习题 有用 学生表,课程表,成绩表,教师表 练习
什么是存储过程?有哪些优缺点? 什么是存储过程?有哪些优缺点? 存储过程就像我们编程语言中的函数一样,封装了我们的代码(PLSQL.T-SQL). 存储过程的优点: 能够将代码封装起来 保存在数据库之 ...
- mysql数据库性能优化(包括SQL,表结构,索引,缓存)
优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...
随机推荐
- Net并行编程高级教程--Parallel
Net并行编程高级教程--Parallel 一直觉得自己对并发了解不够深入,特别是看了<代码整洁之道>觉得自己有必要好好学学并发编程,因为性能也是衡量代码整洁的一大标准.而且在<失控 ...
- 3.1、Eclipse
(原版的:http://www.libgdx.cn/topic/22/3-1-eclipse) 生成项目之后,如今我们来将项目导入到Eclipse中. 在将项目导入到Eclipse之前,确定你已经配置 ...
- 观察者模式(observer行为)c#简单的例子
观察者模式(observer行为)c#简单的例子 几点:模式使观察目标和实现松耦合之间的依赖关系.通知会传播自己主动 样本:玩家击中后发生一系列变化的敌人:后发爆炸.敌人少1一个.... namesp ...
- 比ORA-24777: 我不使用不可移植数据库链接更郁闷的事情达成一致
现场有一个同步误差,内容如下面: java.sql.BatchUpdateException: ORA-24777: 不同意使用不可移植的数据库链路 at oracle.jdbc.driv ...
- 比float更好的页面布局inline-block
一:页面布局的发展过程 桌格设计 表格+css div+css的浮动布局 div+css的内联块布局 二:流行多年的浮动布局的优劣 优势: div+css浮动布局的优势,主要是相对于table布局来说 ...
- SQL Server使用规范
原文:SQL Server使用规范 常见的字段类型选择 1.字符类型建议采用varchar/nvarchar数据类型 2.金额货币建议采用money数据类型 3.科学计数建议采用numeric数据类型 ...
- 快速入门:十分钟学会Python(转)
初试牛刀 假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手册(Cheat ...
- 大约SQL/NoSQL数据库搜索/思考查询
转载请注明出处:jiq•钦's technical Blog Hbase特征: 近期在学习Hbase.Hbase基于行健是建立了索引的,查询速度会很快,全然实时. 可是Hbase要基于行健之外的字段进 ...
- Android发展的一个重要方面Makefile分析
Android发展的一个重要方面Makefile分析 随着移动互联网的发展,移动开发也越来越吃香了.眼下最火的莫过于android.android是什么就不用说了,android自从开源以来,就受到非 ...
- crawler_爬虫开发的准备工作【工具】
俗话说工欲善其事必先利其器,做java网络爬虫开发分析网页的分析工具,抓包工具比不可少,一下是个人常用的几个工具. 1.firefox低版本是为了支持httpwather , ie各个版本都支持htt ...