MySQL之schema设计优化

良好的逻辑设计和物理设计是高性能的基石,应该根据系统要执行的查询语句来设计 schema。这往往需要权衡各种因素。

例如:反范式的设计可以加快某些类型的查询,但同时可能使另一些类型的查询变慢。比如添加计数表和汇总表是一种很好的优化查询的方式,

但是这些表的维护成本会很高。MySQL独有的特性和实现细节对性能影响也很大。

选择优化的数据类型的简单原则:

  1.更小的通常更好

    一般情况下,应该尽量使用可以正确存储数据的最小数据类型。

  2.简单就好

    简单数据类型的操作通常需要更少的cpu周期。

  3.尽量避免NULL

    如果查询包含可为NULL的列,对mysql来说更难优化,因为可为NULL的列使得索引,索引统计,值比较都更复杂。

    可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。

schema设计的第一步,那就是建表,建表的第一步呢就是设计字段,然而了解mysql的数据类型又对设计字段有莫大的帮助。

那我们先来了解mysql的基本数据类型吧。

1.整数类型

  TINYINT, SMALLINT,MEDIUMINT,INT,BIGINT

  8,16,24,32,64,位存储空间。

  MySQL可为证书类型制定宽度,例如INT(11),但对大多数应用这是没意义的;它不会限制值合法范围。对于存储和计算来说

  INT(1) 和 INT(20)是相同的

2.实数类型

  FLOAT,DOUBLE,DECIMAL(精确计算用的)

3.字符串类型

  VARCHARE

    最常见的字符串类型。它比定长类型更节省空间,因为它仅适用必要的空间。有一种情况例外,如果MySQL表使用ROW_FORMAT=FIXED创建的话。

    VARCHAR需要适用1或2个额外字节记录字符串的长度。如果列的最大长度小于等于255,则使用一个字节记录长度。

  CHAR

    是定长的。MySQL总是根据定义的字符串分配足够的空间。当存储CHAR值时,MySQL会删除所有的末尾空格。

    CHAR值会根据需要采用空格填充以方便比较。

    CHAR适合存储很短的字符串。对于经常变更的数据,CHAR也比VARCHAR更好,因为定长CHAR类型不容易产生碎片。

  BLOB和TEXT

    BLOB和TEXT都是为存储很大数据而设计的字符串数据类型,分别采用二进制和字符方式存储。

  使用枚举(ENUM)代替字符串类型

4.日期和时间类型

  DATETIME

    这个类型能保存大范围的值。从1001年到9999年,精度为妙。

  TIMESTAMP

    存储空间小,并且会根据时区变化,有特殊的自动更新能力。精度为妙。

  如果要存储比秒更小粒度的时间时,可以用bigint类型存储微秒级别的时间戳。

5.位数据类型

  BIT

标识符的选择:

  整数类型

    整数通常是标识列的最好选择。因为他们很快,并且可以使用auto_increment

  enum 和 set 类型

  

  字符串类型

    如果可能,尽量避免使用字符串类型作为标识符,因为它们很消耗空间,并且通常比数字类型慢。

    尤其在MyISAM表里使用字符串作为标识列时要特别小心。MyISAM默认对字符串使用压缩索引,这会使查询很慢。

    对于完全‘随机‘的字符串也需要多加注意,例如md5(),sha1(),uuid()产生的字符串。

    这些函数生成的新值会任意分布在很大的空间内,这会导致insert以及一些select语句变得很慢:

      1.因为插入值会随机写到索引的不同位置,所以使得insert语句更慢。这会导致页分裂,磁盘随机访问,以及对于聚簇存储引擎产生聚簇索引碎片。

      2.select语句会变得更慢,因为逻辑上相邻的行为分布在磁盘和内存的不同地方。

      3.随机值会导致缓存对所有类型的查询语句效果都很差。

schema设计中的陷阱

  1.太多的列

  2.太多的关联

  3.全能的枚举

  

范式和反范式

  三大范式:  

    1.必须有主键,列不可分  

    2.当一个表是复合主键时,非主键的字段不依赖于部分主键(即必须依赖于全部的主键字段)

    3.关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖

  反范式,顾名思义,不遵守三大范式。

  首先我们来看看范式的优缺点:

  优点:

    范式化的更新操作通常比反范式快。

    当数据较好地范式化时,就只有很少或者没有重复数据,所以只需要修改更少的数据

    范式化的表通常很小,可以更好的放在内存里,所以执行操作会更快。

    很少有多余的数据意味着检索列表数据更少需要DISTINCT或者GROUP BY语句。

  缺点:

    过度依赖关联。这不但代价昂贵,也可能使一些索引策略无效。

  反范式优缺点:

    因为所有的数据在一张表中,可以很好的避免关联。

    如果不需要关联,则对大部分查询最差的情况,即使没有使用索引,是全表扫描,当数据比内存大时这可能比关联要快得多,

    因为这样避免了随机I/O。

    单独的表能更好的使用索引策略。

 混用范式和反范式才是schema的主流。

缓存表和汇总表

  方便查询,不易维护。

物化视图

  

计数器表

时间: 2024-10-26 17:37:05

MySQL之schema设计优化的相关文章

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限.本章将就如何在 MySQL 数据库 Schema 设计的时候保证尽可能的高效,尽可能减少后期的烦恼. 9.1 高效的模型设计 最规范的就一定

MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化

第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优化,存储引擎的相关参数设置建议将主要在下一章“常用存储引擎的优化”中进行说明. 10.1 MySQL 安装优化 选择合适的发行版本 1. 二进制发行版(包括RPM等包装好的特定二进制版本) 由于MySQL开源的特性,不仅仅MySQL AB提供了多个平

Mysql学习总结(17)——MySQL数据库表设计优化

1.选择优化的数据类型 MySQL支持很多种不同的数据类型,并且选择正确的数据类型对于获得高性能至关重要.不管选择何种类型,下面的简单原则都会有助于做出更好的选择: (1).更小通常更好 一般来说,要试着使用正确地存储和表示数据的最小类型.更小的数据类型通常更快,因为它们使用了更少的磁盘空间.内存和CPU缓存,而且需要的CPU周期也更少. 但是要确保不人低估需要保存的值,在架构中的多个地方增加数据类型的范围是一件极其费力的工作.如果不确实需要什么数据类型,就选择你认为不会超出范围的最小类型. (

数据库schema设计与优化

原文地址 1. 前言 对于数据库而言,在日常开发中我们主要的关注点有两块,一个是schema的结构设计,另一个就是索引的优化,这两块是影响我们最终系统结构和性能的关键部分,自然也是我们花费精力最多的部分: 本文主要介绍数据库设计中的一般原则和优化手段,包括数据库的一半范式.反范式设计.数据切分.数据路由与合并等等 2. Schema设计的一般性原则 2.1 概述 范式理论是关系型数据库设计的黄金法则,它提供了数据结构化的理论基础,有效地保证了数据的一致性,应该说,关系型数据库就是在范式的基础上才

Day4 MySql触发器视图索引以及设计优化

触发器 MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 通过事件触发,不能传参 语法 CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW [trigger_order] trigger_body trigger_t

MySQL之Schema与数据类型优化(一)

选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好一般情况下,应该尽量使用可以正确存储数据的最小数据类型.更小的数据类型通常更快.因为它们占用更少的磁盘.内存和CPU缓存,并且处理时需要的CPU周期也更少.但是要确保没有低估需要存储的值的范围,因为在schema中的增加数据类型的范围是一个非常耗时和痛苦的操作.如果无法确定哪个数据类型是最好的,就选择不会超过范围的最小类型

mysql的schema与数据类型优化分析

Schema与数据类型优化: 1.选择优化的数据类型 更小的通常更好:一般情况下,尽量使用可以正确存储数据的最小数据类型 如:只需存0-200,tinyint unsigned更好. 简单就好:如:整型比字符串操作代价更低,应该使用mysql内建类型而不是字符串来存储日期和时间. 尽量避免NULL:通常情况下最好指定列为NOT NULL,除非真的要存储NULL值.如:查询中包含可为NULL的列对mysql来说更难优化. 2. 选择类型范围 如DATETIME和TIMESTAMP列都可以存储相同类

6.4 Schema 设计对系统的性能影响

前面两节中,我们已经分析了在一个数据库应用系统的软环境中应用系统的架构实现和系统中与数据库交互的SQL 语句对系统性能的影响.在这一节我们再分析一下系统的数据模型设计实现对系统的性能影响,更通俗一点就是数据库的Schema 设计对系统性能的影响. 在很多人看来,数据库Schema 设计是一件非常简单的事情,就大体按照系统设计时候的相关实体对象对应成一个一个的表格基本上就可以了.然后为了在功能上做到尽可能容易扩展,再根据数据库范式规则进行调整,做到第三范式或者第四范式,基本就算完事了 数据库Sch

美图秀秀DBA谈MySQL运维及优化

https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=401797597&idx=2&sn=a0fc08dbb8ce399f0d4cd70bff5b1366&scene=0&key=62bb001fdbc364e56abc83575de147aa1f6fe32d5f4bad7190eadb03350bcfba18b0c9740d43855a5b45e5286bd457cd&ascene=7&uin