Mysql 优化 -- 数据库结构

以下内容仅针对Mysql InnoDB引擎。内容主要来自Mysql 5.6版本Reference Manual。

1 优化数据结构设计

针对表结构进行仔细的设计是十分必要的,因为紧凑的数据结构设计能够显著地减少在磁盘交互时所需要交换的数据量、内存中所需的空间大小。以及,能够相应地减少索引所占的空间。总之,对数据结构进行优化设计能够从速度及空间两方面得到提升,从而提升性能。

1.1 列设计

  • 在满足需求的情况下,只使用能够满足需求(尽量小)的数据类型。例如,MEDIUMTEXT类型占用3个字节(-8388608-8388607),而INT类型占用4个字节的存储空间(-2147483648-2147483647),相对能够节省25%的存储空间。
  • 如果可能,将列声明为NOT NULL。主要从两个方面获益:对于建在非空列上的索引,mysql在使用索引时能够避免检测该列是否为空的额外消耗,从而提高性能;对于每行数据,能够节省1 bit的用来表示此行是否为空的存储空间。

1.2 Row Format设计

在5.6版本中,InnoDB引擎默认的行存储格式为COMPACT。COMPACT,DYNAMIC和COMPRESSED都是同一系列的紧凑型行存储格式,这类存储格式能够降低数据在磁盘的存储空间,带来的负面影响是在某些操作中导致高CPU消耗。如果Mysql性能提升受限于磁盘速度或者缓存命中率,这类型格式能够提升性能表现。而如果Mysql已经达到了CPU瓶颈,采用这种格式可能导致更查的性能表现。

1.3 索引设计

  • 主键(primary key)所占长度应尽可能短。速度上,越短的主键使得能够迅速确定表中的对应行。空间上,对于InnoDB,每个二级索引(secondary index)都会保存一份主键的复制,所以更短的主键能够显著地减少存储空间。
  • 只创建必须的索引来提升查询性能。因为索引虽然能够提升查询性能,但是会造成插入和更新变慢。
  • 如果通过多列限制条件对表进行查询,针对多个条件列创建组合索引,而不要在每一列上单独创建索引。
  • 如果针对表的查询以多列条件查询为通常情况,组合索引中的第一列应为具有最多重复值的列,以此获得更好的索引压缩。(//TODO)

1.4 联结查询(Join)

  • 在某些情况下,将查询频率较高的表转换为两张表进行联合查询能够提升性能。
  • 对于联合查询的表,将联结条件列类型及大小声明为完全一致
  • 保持列名简单,以便能够在多表联合查询的时候使用同样的列名。例如,对于客户表(customer)姓名列声明为name而不是customer_name。

1.5 范式

通常地,应当遵循范式规定,保持数据的低冗余,对于占用较长长度的列单独存储并用id进行关联获取。但在需要获取较好的查询性能的情况下,可以通过数据冗余来提升性能表现。

2 优化数据类型

2.1 数字型

对于唯一ID或者使用数字或字符表示均可的情况,尽可能使用数字类型。因为数字类型通常占用更少的存储空间,并且在类型转换和大小比较时速度更快。

2.2 字符型

  • 使用二进制(binary)collation,以在排序和比较操作时获得更快的速度。
  • 当需要对不同列的数据进行比较时,将这些列声明为相同的编码类型和collation类型。以避免二外的类型转换。
  • 对于小于8KB的字符数据,使用VARCHAR类型,不要采用BLOB类的字段类型。ORDER BY和GROUP BY时产生的临时表,当原始表中没有BLOB类的字段类型时,能够采用MEMORY引擎。(对于utf8编码格式,VARCHAR类型大概能够存储2.7K汉字)
  • 当表中有较长的字符型数据字段,例如地址、姓名,而落在该表上的查询通常并不需要返回这些字段时,可以考虑独立建立一张表存储这些字段。这主要是因为,Mysql在读取某一行的某列数据时,会将该行所在的所有列(还可能包括相邻列)都读取。采用这种分表存储的方式,能够显著减少数据读取时的硬盘I/O和内存占用。
  • 在InnoDB引擎下,对于使用随机产生的值作为主键列的情况,尽可能使用有序的值(例如时间或者日期)作为前缀,以使数据保存尽可能紧凑,这样mysql在读取或者写入时能够更快。

2.3 BLOB类型

  • 对于使用BLOB存储的文本,首先应当考虑对其进行压缩。
  • 与字符型类似,当查询通常不需返回BLOB字段时,考虑分表存储
  • 考虑使用独立的存储设备(SSD)或者数据库实例对其进行存储。
  • 不要对非常长的列进行是否相等的比较,可以通过对内容进行HASH的结果单独存储并在其上建立索引来获得更好的性能表现,在比较时通过HASH列获取更好的性能,然后使用原数据列进行比较得到最终的比较结果。

2.4 使用PROCEDURE ANALYSE进行分析

ANALYSE通过对指定的查询进行分析,返回建议的数据类型优化结果。通过如下句式使用:

SELECT … FROM … WHERE … PROCEDURE ANALYSE(max_elements, [max_memory])

max_elements(默认为256),指定每行分析时每行独立值的个数。

max_memory(默认为8192),指定分析时每列分配的内存大小。

3 内部临时表

在某些情况下,mysql会产生临时表,而用户对这些表并不能取得任何操作控制权限。

产生临时表的常见场景有:子查询、GROUP BY … ORDRER BY 组合 或者 DISTINCT … ORDER BY 组合导致的临时表等。当Msysql创建了临时表时,Created_tmp_table状态变量会对应增加,当临时表为磁盘临时表时,Create_tmp_disk_table会对应增加。

产生磁盘临时表的情况主要有:

  • BLOB或者TEXT列
  • 超过512 byte(二进制字符型)或者512个字符(非二进制)的列出现在GROUP BY 或者 DISTINCT后
  • 使用UNION或者UNION ALL,同时查询列中含有超过512 byte(二进制字符型)或者512个字符(非二进制)的列

对于内存中的临时表,其存储引擎为MEMORY;对于磁盘临时表,其存储引擎为MyISAM。

【Reference】

MySQL 5.6 Reference Manual

原文地址:https://www.cnblogs.com/luojiahu/p/11074794.html

时间: 2024-10-03 23:04:01

Mysql 优化 -- 数据库结构的相关文章

mysql优化-数据库优化、SQL优化

我有一张表w1000,里面有1000万条数据,这张表结构如下:CREATE TABLE `w1000` ( `id` varchar(36) NOT NULL, `name` varchar(10) DEFAULT NULL, `age` int(3) DEFAULT NULL, `money` double(8,2) DEFAULT NULL, `address` varchar(100) DEFAULT NULL, `create_date` datetime(3) DEFAULT NULL

mysql之间数据库结构对比

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

19.Mysql优化数据库对象

19.优化数据库对象19.1 优化表的数据类型应用设计时需要考虑字段的类型和长度,并留有一定长度冗余.procedure analyse()函数可以对表中列的数据类型提出优化建议.procedure analyse()函数用法:select * from 表名 procedure analyse(); -- 对所有列提出优化建议select * from 表名 procedure analyse(16,256); -- 不对包含16至256取值的枚举列提出建议分析的结果是针对每个列,输出该列的最

MySQL之数据库结构优化

1.选择合适的数据类型 一.选择能够存下数据类型最小的数据类型 二.可以使用简单的数据类型.int  要比varchar在MySQL处理上简单 三.尽可能的使用not null  定义字段 四.尽量少用txt类型,非用不可时考虑分表. 五.举例: 使用int类型存储日期时间,利用FROM_UNIXTIME(),UNIX_TIMESEAMP()两个函数转换 mysql> SELECT FROM_UNIXTIME(1234567890, '%Y-%m-%d %H:%i:%S'); +--------

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数据优化--数据库结构的优化

1,比如存时间类型的就使用int类型   其中mysql的两个函数可以拿来使用 unix_timestamp 将时间日期转化为时间戳 from_unixtime 将时间戳转化为日期 2.ip地址存储用bigint类型 说白了 ,就是存储的字节越短越好

mysql优化简介

优化MySQL数据库是数据库管理员的必备技能.通过不同的优化方式达到提高MySQL数据库性能的目的. MySQL 数据库的用户和数据非常少的时候,很难判断一个MySQL数据库的性能的好坏.只有当长时间运行,并且有大量用户进行频繁操作时,MySQL数据库的性能 就会体现出来了.例如,一个每天有几百万用户同时在线的大型网站的数据库性能的优劣就很明显.这么多用户在线的连接MySQL数据库,并且进行查询.插 入.更新的操作.如果MySQL数据库的性能很差,很可能无法承受如此多用户同时操作.试想用户查询一

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

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

MYSQL学习笔记——数据库范式及MYSQL优化整体思路

一.数据库范式                                                                               为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的总结.要想设计一个结构合理的关系型数据库,必须满足一定的范式. 1.1.第一范式(1NF:每一列不可包含多个值)      所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列