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.表的垂直拆分

  标的垂直拆分就是指把含有很多列的表拆分为多个表,这样就可以解决表的宽度问题。拆分原则如下:

    a:不太常用的字段放到一个表中

    b:把大字段独立的放到一个表中

    c:把经常使用的字段放到一个表中

4.表的水平拆分

  表的水平拆分是为了解决表中数据量大的问题,水平拆分的表每一个表结构都是完全一致的。

    一、根据业务属性拆表

      用业务属性拆表,业务关系复杂的情况下,如果要根据其他条件查询,其他的条件都必须和这个属性关联起来,查询条件必须带有这个属性。这种分表方式的算法             大致是取模,hash,md5等。

    二、根据时间拆表

      当表的关系比较复杂时,无法根据某个维度进行分表。但是有明显的时效性。

    三、根据自增长ID拆表

      这种分割法不是取模分,而是每张表存指定量的数据。如果数据量到了,就存放到新表中。这样可以完全控制每张表的数据量。关系非常简单并且有时效性的情况下           可以用。

    四、数据迁移的方式

      当一些很久之前的数据,很少再查询。比如员工工资表,我们可以只存今年的工资情况。而历史数据我们可以迁移到一张salary_old表中,保证数据不会丢失。但            也可以用来查询。

时间: 2024-12-06 16:58:38

MySQL之数据库结构优化的相关文章

《打造扛得住的MySQL数据库架构》第4章 MySQL数据库结构优化

4-1 数据库结构优化介绍 良好的数据库逻辑设计和物理设计是数据库获得高性能的基础. 1.减少不必要的数据冗余. 2.尽量避免数据维护中出现更新,插入和删除异常. 插入异常:如果表中的某个实体随着另一个实体而存在.   更新异常:如果更改表中的某个实体的单独属性时,需要对多行进行更新. 删除异常:如果删除表中的某一实体则会导致其他实体的消失. 3.节约数据存储空间 4.提高查询效率 show create table selectcourse\G select * from selectcour

小蚂蚁学习mysql性能优化(7)--数据库结构优化--选择合适的数据类型

关于SQL以及索引优化的部分终于学习完了,今天开始进入第二层次的学习,数据库的结构优化,第一部分,选择合适的数据类型. 数据类型的选择,重点在于合适二字. 1.    使用可以存下数据的最小的数据类型 比如,一个时间类型的一个数据,可以使用varchar,可以使用datetime,还可以使用int,如何选择,就看哪一种类型对我们来说是最小的,不言而喻,int类型相对来说是最小的数据类型. 2.    使用简单的数据类型. int类型要比varchar类型在mysql处理上简单的多,用int类型来

mysql性能优化学习笔记(5)数据库结构优化

一.选择合适的数据类型    1.使用可存下数据的最小的数据类型    2.使用简单地数据类型,Int<varchar    3.尽可能使用not null定义字段    4.尽量少用text,非用不可最好分表    用Int存储日期时间    from_unixtime()可将Int类型的时间戳转换为时间格式    unix_timestamp()可将时间格式转换为Int类型    存储IP地址——bigInt    利用inet_aton(),inet_ntoa()转换 二.范式设计   

mysql之间数据库结构对比

适应环境:项目中对产品升级,设计到两个版本数据库结构不同 使用工具:Navicat 1.准备两个版本的数据库 2.打开工具Navicat 3.分别连接两个数据库 4.点击"工具-结构同步" 5.常规中选择两个连接的数据库进行对比,已左边数据库为模板生成不同 6.将比较出的不同文件导出,导入到新版的数据库中,两版本的数据库结构即同步完成 7.结构同步后进行数据库数据同步 8.升级完成

mysql数据库优化 数据库结构优化

数据结构优化 一.选择格式的数据类型 数据类型的选择,重点在于合适二字,如何确定选择的数据类型是否合适?1.使用可以存下你的数据的最小的数据类型.2.使用简单的数据类型,Int要比varchar类型在mysql处理上简单:3.尽可能的使用not null定义字段:4.尽量少使用text类型,非用不可时最好考虑分表.//使用int类型存储时间类型from_unixtime(),unix_timestamp()时间戳转换//使用bigint存储ip地址inet_aton('192.168.132.1

Mysql 性能优化5【重要】数据库结构优化

数据库设计的步骤 我们大多使用mysql 设计三范式 设置时区  

Mysql性能优化----SQL语句优化、索引优化、数据库结构优化、系统配置优化、服务器硬件优化

一.SQL语句优化 1-1.MySQL慢日志 1).慢日志开启方式和存储格式 如何发现有问题的SQL? 使用Mysql慢日志对有效率问题的SQL进行监控 前期准备 mysql> show variables like '%log_queri%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_no

MySQL数据库性能优化之一

MySQL数据库性能优化需要考虑的几个方面: 1.sql语句及索引优化 2.数据库结构优化 3.系统配置优化 4.硬件优化

Mysql数据库性能优化大总结

目录:[TOC] 影响数据库服务器性能的因素 超高的QPS(每秒钟处理的查询量)和TPS导致SQL处理效率下降. 大量的并发导致的数据库连接数被占满和超高的CPU占用率导致资源耗尽服务器宕机. 磁盘IO性能瓶颈导致数据传输效率下降,计划任务导致磁盘IO下降. 网卡IO性能瓶颈,要减少从服务器数量,缓存要分级,避免使用 select * 这样的查询. 大表导致的问题: 不同数据库引擎对于大表的概念是不一样的. InnoDB存储引擎没有明确的大表概念. 实际使用中发现当一个数据表中的数据超过千万行的