MYSQL数据库的设计与调优
优化思路:
1.检查数据表结构,改善不完善设计
2.跑一遍主要业务,收集常用的数据库查询SQL
3.分析查询SQL,适当拆分,添加索引等优化查询
4.优化SQL的同时,优化代码逻辑
5.添加本地缓存和redis缓存
6.增加数据库硬件配置和增加读写分离
检查数据表结构
看数据表结构设计是否合理。
尽可能不要使用NULL值
建表的时候如果不对创建的值设置默认值,MYSQL设置默认都会为NULL。
NULL使得索引维护更加复杂,强烈建议对索引列设置NOT NULL
NOT IN、!=等负向条件查询在有NULL值的情况下返回永远为空结果,查询容易出错。
NULL列需要一个额外字节作为判断是否为NULL的标志位。
使用NULL时和该列其他的值可能不是同种类型,导致问题。(在不同的语言中表现不一样)。
MySQL难以优化为NULL的列的查询。
添加索引
对于经常查询的字段,请加上索引,有索引和没有索引的查询速度相差十倍甚至更多。
一般来说,每张表都需要有一个主键id字段常用于查询的字段应该设置索引varchar类
型的字段,在建立索引的时候,最好指定长度查询有多个条件时,优先使用具有索引
的条件像LIKE条件这样的模糊搜索对于字段索引是无效的,需要另外建立关键词索引
来解决请尽量不要在数据库层面约束表和表之间的关系,这些表之间的依赖应该在代
码层面去解决。当表和表之间有约束时,虽然增删查的SQL语句变简单了,但是带来
的负面效果是插入等操作数据库都会去检查约束(虽然可以手动设置忽略约束),这
样相当于把一些业务逻辑写到了数据库层,不便于维护。
优化表字段结构
数据库中那些可以用整形表示的数据就不要使用字符串类型,到底是用varchar还是char
要看字段的可能值。这种优化往往在数据库中有大量数据以后是不可行的,最好在数据库
设计之前就设计好。对于那些可能值很有限的列,使用tinyint代替VARCHAR,比如记录移
动设备平台,只有两个值:android,ios,那么就可以使用0表示android,1表示ios,这种
列一定要写好注释为什么不用ENUM呢?ENUM扩展困难,比如后来移动平台又增加了一
个ipad,那岂不是懵逼了,而tinyint加个2就行,而且ENUM在代码里面处理起来特别奇怪,
是当成整形呢还是字符串,各个语言不一样。这种方式,一定要在数据库注释或者代码里面
写明各个值的含义对于那些定长字符串,可以使用char,比如邮编,总是5位对于那些长度未
知的字符串,使用varchar不要滥用bigint,比如记录文章数目的表id字段,用int就行了,21亿
篇文章上限够了适当打破数据库范式添加冗余字段,避免查询时的表连接查询的时候,肯定int
类型比varchar快,因为整数的比较直接调用底层运算器就可以实现,而字符串比较要逐个字符
比较。定长数据比变长数据查询快,因为比较定长数据与数据之间的偏移是固定的,很容易计算
下一个数据的偏移。而变长数据则还需要多一步去查询下一个数据的偏移量。不过。定长数据可
能会浪费更多的存储空间。
大表拆分
对于那些数据量可能近期会超过500W或者增长很快的表,一定要提前做好垂直分表或者水平分表,
当数据量超过百万以后,查询速度会明显下降。分库分表尽量在数据库设计初期敲定方案,否则后
期会极大增加代码复杂性而且不易更改。垂直分表是按照日期等外部变量进行分表,水平分表是按
照表中的某些字段关系,使用hash映射等分表。分库分表的前提条件是在执行查询语句之前,已经
知道需要查询的数据可能会落在哪一个分库和哪一个分表中。
优化查询语句
这个才是很多系统数据库瓶颈的始作俑者。
请尽量使用简单的查询,避免使用表链接请尽量避免全表扫描,包括但不限于:where子句条件横真
或为空使用LIKE使用不等操作符(<>、!=)查询含义is null的列在非索引列上使用or多条件查询时,
请把简单查询条件或则索引列查询置于前面请尽量指定需要查询的列,不要偷懒使用select *如果不
指定,一方面会返回多余的数据,占用宽带等另一方面MySQL执行查询的时候,没有字段时会先去
查询表结构有哪些字段大些的查询关键字比小写快一点点使用子查询会创建临时表,会比链接(JOIN)
和联合(UNION)稍慢在索引字段上查询尽量不要使用数据库函数,不便于缓存查询结果当只要一行数
据时,请使用LIMIT 1,如果数据过多,请适当设定LIMIT,分页查询千万不要 ORDER BY RAND(),性
能极低。
上面是我总结的一些小tips,这些规则是死的,但是业务场景是活的,在实际使用的过程中,比如数据统计,可以适当牺牲性能换取便利。
添加缓存
使用redis等缓存,还有本地文件缓存等,可以极大地减少数据库查询次数。缓存这个东西,一定要分析自己系统的数据特点,适当选择。
对于一些常用的数据,比如配置信息等,可以放在缓存中可以在本地缓存数据库的表结构缓存的数据一定要注意及时更新,还有设置有效期增加缓存务必会增加系统复杂性,一定要注意权衡
MYSQL数据库的设计与调优的更多相关文章
- MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化
第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就 ...
- mysql数据库架构设计与优化
mysql数据库架构设计与优化 2019-04-23 20:51:20 无畏D尘埃 阅读数 179 收藏 更多 分类专栏: MySQL 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...
- 第 9 章 MySQL数据库Schema设计的性能优化
前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只 ...
- MySQL慢查询查找和调优测试
MySQL慢查询查找和调优测试,接下来详细介绍,需要了解的朋友可以参考下.本文参考自:http://www.jbxue.com/db/4376.html 编辑 my.cnf或者my.ini文件,去除 ...
- MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化
第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化, ...
- Mysql千万级数据性能调优配置
背景: 笔者的源数据一张表大概7000多万条,数据大小36G,索引6G,加起来表空间有40G+,类似的表有4张,总计2亿多条 数据库mysql,引擎为innodb,版本5.7,服务器内存256G,物理 ...
- Mysql运行状态查询命令及调优详解
(转载自点击打开链接) MySQL运行状态及调优(一) 一.查看MySQL运行情况SHOW STATUS; 二.查看INNODB数据库引擎运行状态SHOW ENGINE INNODB STATUS; ...
- 用MySQL的optimizer_trace进行sql调优
在我们调优MySQL的SQL时候,通常使用三种工具进行查看sql执行的效率,explain.profile.optimizer_trace.前两个经常被人使用,由于第三个难度较大,大家使用的较少,下面 ...
- MySQL 5.6初始配置调优
原文链接: What to tune in MySQL 5.6 after installation原文日期: 2013年09月17日翻译日期: 2014年06月01日翻译人员: 铁锚 随着 大量默认 ...
随机推荐
- Oracle知识点总结2
1.聚合函数:也叫分组函数. 常用聚合函数:返回的都是NUMBER类型的值. 注:避免使用 COUNT(*) ,而使用 COUNT(ROWID) 2.分组统计:group by 字段名 having ...
- windows10 uwp获取设备当前地理位置(经纬度)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 系统运行缓慢,CPU 100%,以及Full GC次数过多问题的排查思路
前言 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警. 本文主要针对系统运 ...
- Iterator和Enumeration的区别
从源码可以看出,Iterator除了能读取集合的数据之外,也能数据进行删除操作:而Enumeration只能读取集合的数据,而不能对数据进行修改. Iterator支持fail-fast机制,而Enu ...
- 使用FastJson进行对象和JSON转换属性命名规则为下划线和驼峰的问题
public class AliPayParam { @JSONField(name="out_trade_no") private String outTradeNo; @JSO ...
- Event-Loop In JS
原文:最后一次搞懂 Event Loop 自打 ES 6 推出 Promise 改善了 js 的异步编程之后,eventloop 也越来越多地出现在视野当中.借用大佬们的话:“Event Loop 是 ...
- SpringBoot配置MySql数据库和Druid连接池
1.pom文件增加相关依赖 <dependency> <groupId>mysql</groupId> <artifactId>mysql-connec ...
- [LOJ3087][GXOI/GZOI2019]旅行者——堆优化dijkstra
题目链接: [GXOI/GZOI2019]旅行者 我们考虑每条边的贡献,对每个点求出能到达它的最近的感兴趣的城市(设为$f[i]$,最短距离设为$a[i]$)和它能到达的离它最近的感兴趣的城市(设为$ ...
- 怎么用MATLAB产生FPGA所需的hamming窗系数
需求 在FPGA处理中如果需要对待处理数据加窗,则需要窗系数存储在ROM中以供使用. 前言 MATLAB窗函数说明 流程 比如加个hamming窗,8192点,16bit放大,最终系数18bit位宽. ...
- 升级 pip 超时解决方案
安装的时候发现报错如下, 提示需要升级pip 按照指引进行升级, 同样的超时 使用 豆瓣源进行安装 pip python -m pip install --upgrade pip -ihttp://p ...