如何对数据库进行优化

14 篇文章 0 订阅
订阅专栏

数据库是什么?

简单来说数据库就是将数据按照一定顺序存储到磁盘上的一个软件,我们平时写的sql语句,就是用数据库软件能识别的语言,对数据进行增删改查。其实数据本质上是不存在表里,而是存在磁盘上,所谓的表只是数据存储空间的名字。

如何优化

数据库优化的底层逻辑,就是优化cpu从磁盘读写数据的时间,一般降低时间有两种方式,一种是提高速度,第二种是缩短路程。

一、提高数据的读写速度:

改变硬件配置:

可以通过更换更加高端的cpu,频率更高的内存,把机械硬盘换成更好的固态硬盘。

硬件升级后还不够,还需要更改数据库的配置文件,让数据库能体会到硬件的变化,采用更加激进的策略去读取数据,对于mysql来说,可用 innodb 的下面这两个参数来配置:

innodb_io_capacity,innodb_io_capacity_max 控制的是 innodb 刷脏页的能力。

过小会导致 mysql 刷脏页能力不足,影响性能。过大会让 mysql 认为 io 能力很强,会造成 io 尖峰。

nnodb_io_capacity
参数定义了InnoDB后台任务每秒可用的I/O操作数(IOPS),例如用于从buffer pool中刷新脏页和从change buffer中合并数据。
innodb后台进程最大的I/O性能指标,影响刷新赃页和插入缓冲的数量,在高转速磁盘下,尤其是现在SSD盘得到普及,可以根据需要适当提高该参数的值。

在压力下,控制当刷新脏数据时MySQL每秒执行的写IO量
解释一下什么叫“在压力下”,MySQL中称为”紧急情况”,是当MySQL在后台刷新时,它需要刷新一些数据为了让新的写操作进来。然后,MySQL会用到innodb_io_capacity_max。
那么,应该如何设置innodb_io_capacity和innodb_io_capacity_max呢?
最好的方法是测量你的存储设置的随机写吞吐量,然后给innodb_io_capacity_max设置为你的设备能达到的最大IOPS。innodb_io_capacity就设置为它的50-75%,特别是你的系统主要是写操作时。

另外一点就是增加mysql缓冲池的大小,mysql很多时候不会直接读写磁盘的数据,会根据自己的算法,通过缓冲池缓存磁盘的数据到内存中,来提高查询效率,还会根据淘汰算法,来更新缓存中的冷热数据,保证缓存的命中率。

需要注意的一点是缓冲池大小参数不是越高越好,一般要通过不断测试调整来得到一个合适的结果。例如通过调大innodb_io_capacity的参数,虽然脏页刷新的速度得到了提升,但是刷新脏页会阻塞该页的数据访问,过多无意义的刷新也会增加cpu的负担。

下面列出了mysql数据优化配置常用参数:

 

二、通过缩短查询路程达到优化的效果:

1、索引

缩短路程的关键点就是索引,建立好合适的索引能显著提高查询速度。

如果不太了解索引的同学可以看下: MySQL索引15连问,你能坚持到第几问?_YuanlongWang的博客-CSDN博客

当然在写sql的时候要尽量避免索引失效导致全表扫描,什么情况下会导致索引失效,下面列出了一个表给大家参考:

 2、SQL语句优化

1)尽量少 join。MySQL 的优势在于简单,但这在某些方面其实也是其劣势。MySQL优化器效率高,但是由于其统计信息的量有限,优化器工作过程出现偏差的可能性也就更多。对于复杂的多表 Join,一方面由于其优化器受限,再者在Join这方面所下的功夫还不够,所以性能表现离Oracle等关系型数据库前辈还是有一定距离。但如果是简单的单表查询,这一差距就会极小甚至在有些场景下要优于这些数据库前辈。

2)尽量少排序。排序操作会消耗较多的 CPU 资源,所以减少排序可以在缓存命中率高等 IO 能力足够的场景下会较大影响 SQL的响应时间。

3)尽量避免 select *,并尽量用join代替子查询

4)尽量少使用“or”关键字。当 where 子句中存在多个条件以“或”并存的时候,MySQL 的优化器并没有很好的解决其执行计划优化问题,再加上 MySQL 特有的 SQL 与 Storage 分层架构方式,造成了其性能比较低下,很多时候使用 union all 或者是union(必要的时候)的方式来代替“or”会得到更好的效果。

6)尽量用 union all 代替 union。union 和 union all 的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的 CPU 运算,加大资源消耗及延迟。所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用 union all 而不是 union。

7)避免类型转换

8)能用DISTINCT的就不用GROUP BY

9)尽量不要用SELECT INTO语句 

10)从全局出发优化,而不是片面调整。SQL 优化不能是单独针对某一个进行,而应充分考虑系统中所有的 SQL,尤其是在通过调整索引优化 SQL的执行计划的时候,千万不能顾此失彼,因小失大。

3、表结构优化

MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个page中可存放的数据行数增大,那么每次 IO 可访问的行数也就增多了。反过来说,处理相同行数的数据,需要访问的 page 就会减少,也就是 IO 操作次数降低,直接提升性能。

数据类型选择

原则是:数据行的长度不要超过8020字节,如果超过这个长度的话在物理页中这条数据会占用两行从而造成存储碎片,降低查询效率;字段的长度在最大限度的满足可能的需要的前提下,应该尽可能的设得短一些,这样可以提高查询的效率,而且在建立索引的时候也可以减少资源的消耗。 ? ?

1)数字类型:非万不得已不要使用DOUBLE,不仅仅只是存储长度的问题,同时还会存在精确性的问题。同样,固定精度的小数,也不建议使用DECIMAL,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。

2)字符类型:定长字段,建议使用 CHAR 类型(char查询快,但是耗存储空间,可用于用户名、密码等长度变化不大的字段),不定长字段尽量使用 VARCHAR(varchar查询相对慢一些但是节省存储空间,可用于评论等长度变化大的字段),且仅仅设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定,因为不同的长度范围,MySQL也会有不一样的存储处理。

3)时间类型:尽量使用TIMESTAMP类型,因为其存储空间只需要DATETIME 类型的一半。对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。不建议通过INT类型类存储一个unix timestamp 的值,因为这太不直观,会给维护带来不必要的麻烦,同时还不会带来任何好处。

4)ENUM &SET:对于状态字段,可以尝试使用 ENUM 来存放,因为可以极大的降低存储空间,而且即使需要增加新的类型,只要增加于末尾,修改结构也不需要重建表数据。

字符编码

字符集直接决定了数据在MySQL中的存储编码方式,由于同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少IO操作次数。

尽量使用 NOT NULL

NULL 类型比较特殊,SQL 难优化。虽然 MySQL NULL类型和 Oracle 的NULL有差异,会进入索引中,但如果是一个组合索引,那么这个NULL 类型的字段会极大影响整个索引的效率。虽然 NULL空间上可能确实有一定节省,倒是带来了很多其他的优化问题,不但没有将IO量省下来,反而加大了SQL的IO量。所以尽量确保 DEFAULT 值不是 NULL,也是一个很好的表结构设计优化习惯。

4.数据库架构优化

分布式和集群化

1)负载均衡。负载均衡集群是由一组相互独立的计算机系统构成,通过常规网络或专用网络进行连接,由路由器衔接在一起,各节点相互协作、共同负载、均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器。MySQL一般部署的是高可用性负载均衡集群,具备读写分离,一般只对读进行负载均衡。

2)读写分离。读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作,其实在很多系统中,主要是读的操作。当主数据库进行写操作时,数据要同步到从的数据库,这样才能有效保证数据库完整性。

3)数据切分。通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库上,实现分布存储,通过路由规则路由访问特定的数据库,这样一来每次访问面对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器的负载压力。

怎样优化数据库?怎样优化数据库的查询效率?
HU1656的博客
04-13 698
一.优化数据库的查询效率 存储引擎的选择:如果数据表需要支持事务处理,应该考虑 Innodb ,因为它完全符合 ACID 的特性;如果不需要支持事务处理,则使用存储引擎MyISAM 对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 以及 order by 字句涉及的列上建立响应的索引 尽量避免在 where 子句当中使用 != 或者 > , < 等操作符,否则将导致存储...
MySQL数据库优化的八种方式(经典必看)
热门推荐
weixin_30521161的博客
12-21 1万+
引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿到自己的总结文集中,积累优质文章,提升个人能力,希望对大家今后开发中也有帮助 1、选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表...
深入MySQL数据库设计:优化与高级功能
最新发布
weixin_52938153的博客
09-04 1562
在现代信息系统中,数据库不仅需要存储和管理大量数据,还需要具备高效的查询性能、强大的事务处理能力以及健全的安全机制。本教程将深入探讨MySQL数据库优化和高级功能,包括数据库优化、高级SQL功能、事务管理、数据库安全以及备份与恢复策略等内容。
掌握MySQL数据库这些优化技巧,事半功倍!
weixin_34018202的博客
04-08 146
一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善。这篇文章主要谈谈MySQL数据库在发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 阶段一:数据库表设计 项目立项后,开发部门根据产品部门需求开发项目。开发工程师在开发项目初期会对表结构设计。对于数据库来说,表结构设计很重要,如果设计不当,会直接影响到用户访...
数据库优化
weixin_34007879的博客
10-02 71
数据库优化 1).SQL语句优化 a应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 b应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后...
怎么优化数据库
qq_37804341的博客
04-19 370
1,设计方面,考虑最优字段,尽量不要设置空值数据,虽然稍微的放空填入的数据值会使用户操作体验更好 2,查询方面,尽量使用子查询完成多个逻辑的SQL操作,多使用JOIN,对于临时表 多使用联合查询来解决,这样能够保证数据库整齐性 3,使用事务或锁定表,来保证数据库数据完整性 4,使用索引,索引能够更有效率的查询数据 5,查询时最好不要使用*号进行查询概括,在有索引的字段尽量不要使用函数操作,尽量不要...
浅谈MySQL数据库性能优化
12-14
本文侧重通过优化MySQL 数据库缓存参数如查询缓存,表缓存,日志缓存,索引缓存,innodb缓存,插入缓存,以及连接参数等方式来对MySQL数据库进行优化。  缓存参数  这里先引用一句话,从内存中读取一个数据的...
SQL Server数据库性能优化.doc
05-04
SQL Server 数据库性能优化是指通过对数据库进行优化来提高其性能,使其能够更好地满足应用程序的需求。影响 SQL Server 数据库性能的因素有很多,包括数据库设计、查询设计、索引设计、存储过程设计、锁机制设计等...
MySQL数据库性能优化之缓存参数优化
01-31
在平时被问及最多的问题就是关于MySQL数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级MySQLDBA以及其他对MySQL性能优化感兴趣的朋友们有所帮助。数据库属于IO密集型...
MySQL数据库性能优化之表结构优化
12-14
这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用。  这是 MySQL数据库性能优化专题 系列的第二篇文章:MySQL 数据库性能优化之表结构优化  系列的第一篇文章:MySQL 数据库性能优化...
数据库优化
H215919719的博客
02-05 440
比如:根节点存储大于50和小于50两个范围,两个分支节点,大于50的分支节点存储50-60、60-70、大于100等区段,每个区段都有对应的叶子节点,比如大于100的区段下面的叶子节点存储100、101、102和对应的rowid等具体数据,100、101、102的值即为表中建立索引的列(比如:num)的值,当编写sql语句where num=101时,就会通过检索索引表,查询到叶子节点上存储的rowid,然后根据rowid查询对应的数据,避免了对数据表的全表扫描。它必须在编译时进行选择。
MySQL:SQL调优的简单技巧
王小二(海阔天空)
05-29 3296
如果不查询表中所有的列,尽量避免使用 SELECT *,因为它需要先查询 table meta,增大了数据库服务器的负担,以及它与应用程序客户端之间的网络IO开销。然而,为了达到更好的性能以及更好的数据控制,可以将他们变成多个小查询。只是“尽量”哦,并不是说所有的列。明知只有一条查询结果,那请使用 “LIMIT 1”。不仅提高了性能,同时减少了不必要的数据库和应用间的网络传输。为获得相同结果集的多次执行,保持SQL语句前后一致。同样只是“尽量”哦,并不是说所有的列。“=”增加了索引的使用几率。
数据库性能优化详解
逍遥飞鹤的专栏
07-23 1万+
一、数据库访问优化法则简介 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬盘可能会是瓶颈点,为什么这些一般的工作我们能快速确认瓶颈点呢,因为我们对这些慢速设备的性能数据有一些基本的认识,如网络带宽是2Mbps,硬盘是每分钟7200转等等。因此,为了快速找到SQ
50种方法巧妙优化你的SQL Server数据库
03-22 2332
 50种方法巧妙优化你的SQL Server数据库 查询速度慢的原因很多,常见如下几种:      1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)      2、I/O吞吐量小,形成了瓶颈效应。      3、没有创建计算列导致查询不优化。      4、内存不足      5、网络速度慢      6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据
数据库优化详解
程序员世杰
03-06 2136
一、优化方向 可以看出来,数据结构、SQL、索引是成本最低,且效果最好的优化手段。 数据库优化从以下几个方面优化数据库设计—三大范式、字段、表结构 数据库索引 存储过程 (模块化编程,可以提高速度) 分表分库 (水平分割,垂直分割) 主从复制、读写分离 SQL 调优 对 MySQL 配置优化 (配置最大并发数 my.ini, 调整缓存大小) 定时清除不需要的数...
如何优化数据库
weixin_57413199的博客
12-29 321
1.查询的时候尽量使用字段名不要写*; 2.删除表中所有数据的时候不要使用Delete from 表名,要使用 truncate table 表名; 3.使用join关联表的时候最多不要超过3个表关联; 4.在使用in的时候集合中的数据最好不要超过200条; 5.在设置表的时候,尽量设置字段不为null,除非这个字段有必须为null; 6.使用索引的方式; 7.分库分表。 ...
数据库优化方式(全)
当我把这件事情做出来的时候,我想要的东西就已经拿到了
06-21 463
数据库优化方式 优化索引、SQL 语句、分析慢查询; 设计表的时候严格根据数据库的设计范式来设计数据库; 使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能节约磁盘 IO 优化硬件;采用 SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等 采用 MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁盘的读取效率; 垂直分表;把一...
写文章

热门文章

  • 利用sqlmap进行POST注入 127720
  • C# 搭建一个简单的WebApi项目 115554
  • 关于 未能加载文件或程序集“”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 的解决办法 60824
  • plsql 监听程序当前无法识别连接描述符中请求的服务 解决方法 59900
  • 详解ESP32模块的引脚分配图和定义 48873

分类专栏

  • 网络通讯 1篇
  • 单片机 2篇
  • docker 3篇
  • milvus 1篇
  • mysql 14篇
  • 数据库 2篇
  • redis 1篇
  • web前端开发 35篇
  • css3 1篇
  • javascript 9篇
  • echarts 3篇
  • css 2篇
  • oracle 7篇
  • c# 53篇
  • vue 7篇
  • WebSocket 4篇
  • 微信公众号开发 8篇
  • es6 1篇
  • 支付宝 2篇
  • 微信支付 1篇
  • 加密、解密 4篇
  • webpack 2篇
  • springboot 1篇
  • 系统架构 1篇

最新评论

  • 数据库的底层原理,你知道吗?

    倾城✎夜未央: 这篇文章确实很好,感谢转载让我看到表情包

  • 详解ESP32模块的引脚分配图和定义

    Winlams: https://item.szlcsc.com/2895633.html https://atta.szlcsc.com/upload/public/pdf/source/20210401/C2764099_9D100F930B72D61EF5CEAFBEB3D51CE8.pdf?Expires=4070880000&OSSAccessKeyId=LTAIJDIkh7KmGS1H&Signature=XsA49GmIJq6hPPHW%2FxqmwVdapdo%3D&response-content-disposition=attachment%3Bfilename%3DC2764099_%25E5%25BC%2580%25E5%258F%2591%25E6%259D%25BF_NODEMCU-32-%2528ESP-32S%2529_%25E8%25A7%2584%25E6%25A0%25BC%25E4%25B9%25A6_AI-THINKER%2528%25E5%25AE%2589%25E4%25BF%25A1%25E5%258F%25AF%2529%25E5%25BC%2580%25E5%258F%2591%25E6%259D%25BF%25E8%25A7%2584%25E6%25A0%25BC%25E4%25B9%25A6.PDF

  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式

    代码无路: 在查看Swagger的时候没有这一层,怎么搞?

  • 详解ESP32模块的引脚分配图和定义

    爬上树顶: 板载 typec 就两个功能: 供电 + 烧录数据传输。 供电可能是走 vin、数据传输嘛。。驱动一般是 ch340 做的转 AURT 口(还能再推断下去吗)

  • 详解ESP32模块的引脚分配图和定义

    爬上树顶: 10 块钱价位的那种

最新文章

  • docker (56) Recv failure: Connection reset by peer
  • vue前端项目命令框输入npm run serve报error:03000086:digital envelope routines::initialization error错误
  • supervisorctl重启服务
2024年10篇
2023年30篇
2022年15篇
2021年4篇
2019年8篇
2018年37篇
2017年47篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuanlongWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

深圳坪山网站建设公司海原企业网站优化南宁seo网站排名优化价格郑州家居行业网站优化推广技巧宿迁营销网站优化供应濮阳家居行业网站优化推广可靠吗题目类网站怎么优化浦东新区官方网站优化排名网站性能监测与优化云浮网站关键词排名优化多少钱新的网站优化站长之家网站优化怎么优化安徽省六安市网站优化排名网站建设导航优化优化网站版面和栏目设计推广蜘蛛屯网站排名优化南湖手机网站优化湖州网站seo优化服务企业网站排名优化 云尚网络延边网站综合优化陇南百度网站优化公司网站优化外包泰州网站优化平台网站优化难应付吗萝岗seo网站优化推广技巧优化公司网站蛋竞云速捷出众奎文网站优化推广外包在哪里可以进行网站优化大连规模大的传统行业网站优化莱阳如何优化网站网站推优化香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化