数据库优化相关知识

参考的大佬博客
我是知识的搬运工(在线卑微)

Mysql数据特点:

系统的数据都从数据库上来,数据库的吞吐量和速度一定程度决定系统的并发和响应速度;系统运行与数据量成正比,数据读处理尤其是查询自然就慢;Mysql数据库的数据最终在磁盘上持久化存储,读写不如Redis等这些内存数据库

1. 数据库设计

1.1表中的字段是最小不可再分的(字段原子性)

在这里插入图片描述

1.2消除对主键的部分依赖

商品表有商品id,商品id为商品的主键,但是需要创建一个商品编号列来专门处理业务,因为id太敏感,处理业务都是用商品编号来处理(比如展示商品时展示编号等等)
在这里插入图片描述

1.3表中的每一列只与主键直接相关而不是间接相关

在这里插入图片描述

2. 数据类型

2.1使用正确存储数据的最小数据类型

更小的数据类型意味着更快,占用更少的磁盘,内存、缓存和处理时间

2.2使用整型表示字符串

字符集的校对规则比整型更复杂,如:使用数据库内置的datetime类型存储时间而不是字符类型,我们使用整型存储ip而不是直接将ip字符串存到数据库中

2.3索引尽量不要创建到可以为null的字段上
2.4使用VARCHAR而不是CHAR

VARCHAR比定长字符串(CHAR)更节省空间,仅使用必要的空间另外VARCHAR需要额外字节记录字符串长度(不同情况需要字节数不同)

2.5日期和时间类型

datetime
使用8字节存储空间,保存从1001年到9999年的秒数。与时区无关,默认情况下,Mysql以一种可排序的格式显示它的值,例如:“2018-10-14 22:30:08”

timestamp
只使用4字节存储,保存1970年1月1日午夜以来的秒数,依赖于系统时区,和UNIX时间戳相同,转换函数分别为FROM_UNIXTIME()和UNIX_TIMESTAMP(),可以设置根据当前时间戳更新,比如我们熟悉的update_time字段

2.6整数类型

UNSIGNED
属性表示不允许负值,可以使得正数的上限提高一倍,比如tinyint+unsigned可以使原本的-128127的范围变为0255

tinyint
我们一般用它存储状态值而不要用int,如果是Boolean类型,那么tinyint(1)当值为1和0时,查询结果自动转为true和false,条件参数相应的也可以直接传入true和false即可

INT(11)
不会限制值的范围,只是规定了一些客户端工具用来显示的字符的个数,所以对于存储和计算来说INT(11)和INT(1)相同

2.7IP地址

实际上是32位无符号整数,用INT存储,Mysql提供转换函数为INET_ATON()和INET_NTOA()

2.8小数

decimal不会损失精度,存储空间会随数据的增大而增大。double占用固定空间,较大数的存储会损失精度,通常存金额用decimal(11,2),这表示整数部分和小数部分分别为9位和2位注意!,当然可以根据具体的金额大小选择长度,注意这时候对应的java中用BigDecimal类来处理运算时要仔细,因为加减法和比较跟平常不一样

3.存储引擎

数据库存储引擎是数据库底层组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。我们可以通过SHOW ENGINES;

3.1InnoDB存储引擎

InnoDB越做越好从MySQL5.5版本之后,MySQL的默认内置存储引擎已经是InnoDB,主要特点有

容灾恢复性比较好
支持事务,默认事务隔离界别为可重复读
使用的锁粒度为行锁,可以支持更高的并发
支持外键
配合一些热备工具可以支持在线热备份
在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度
对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。根据主键进行排序,数据和索引放在一块,都位于B+数的叶子节点上

3.2MyISAM存储引擎

在5.5版本之前,MyISAM是MySQL的默认存储引擎,该存储引擎并发性差,不支持事务,所以使用场景比较少,主要特点有

不支持事务
不支持外键,如果强行增加外键,不会提示错误,只是外键不其作用
对数据的查询缓存只会缓存索引,不会像InnoDB一样缓存数据,而且是利用操作系统本身的缓存
默认的锁粒度为表级锁,所以并发度很差,加锁快,锁冲突较少,所以不太容易发生死锁
支持全文索引(MySQL5.6之后,InnoDB存储引擎也对全文索引做了支持),但是MySQL的全文索引基本不会使用,对于全文索引,现在有其他成熟的解决方案,比如:ElasticSearch,Solr,Sphinx等
数据库所在主机如果宕机,MyISAM的数据文件容易损坏,而且难恢复

3.3MEMORY存储引擎

将数据存在内存中,和市场上的Redis,memcached等思想类似,为了提高数据的访问速度,主要特点有

支持的数据类型有限制,不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型
支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈
由于数据是存放在内存中,所以在服务器重启之后,所有数据都会丢失
查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低

3.4ARCHIVE存储引擎

ARCHIVE存储引擎适合的场景有限,由于其支持压缩,故主要是用来做日志,流水等数据的归档,主要特点有

支持Zlib压缩,数据在插入表之前,会先被压缩
仅支持SELECT和INSERT操作,存入的数据就只能查询,不能做修改和删除;
只支持自增键上的索引,不支持其他索引
CSV存储引擎
数据中转试用,主要特点有

其数据格式为.csv格式的文本,可以直接编辑保存
导入导出比较方便,可以将某个表中的数据直接导出为csv,试用Excel办公软件打开
选择依据
如果没有特殊需求默认使用InnoDB引擎即可

MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。
Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键保证数据完整性。比如OA自动化办公系统

4.sql指令优化

1、查询尽量避免全表扫描,首先考虑在where、order by字段上添加索引

2、避免在where字段上使用NULL值,所以在设计表时尽量使用NOT NULL约束,有些数据会默认为NULL,可以设置默认值为0或者-1

3、避免在where子句中使用!=或<>操作符,Mysql只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE使用索引

4、避免在where中使用OR来连接条件,否则可能导致引擎放弃索引来执行全表扫描,可以使用UNION进行合并查询

  select id from t where num = 30 union select id from t where num = 40;

5、尽量避免在where子句中进行函数或者表达式操作

6、最好不要使用select * from t,用具体的字段列表代替"*",不要返回用不到的任何字段

7、in 和 not in 也要慎用,否则会导致全表扫描,如

select id from t where num IN(1,2,3)如果是连续的值建议使用between and,select id from t where between 1 and 3;

8、select id from t where col like %a%;模糊查询左侧有%会导致全表检索,如果需要全文检索可以使用全文搜索引擎比如es,slor

9、limit offset rows关于分页查询,尽量保证不要出现大的offset,比如limit 10000,10相当于对已查询出来的行数弃掉前10000行后再取10行,完全可以加一些条件过滤一下(完成筛选),而不应该使用limit跳过已查询到的数据。这是一个offset做无用功的问题。对应实际工程中,要避免出现大页码的情况,尽量引导用户做条件过滤

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值