mysql优化三

相对高并发一样,速度都是优化出来的,在高并发处理的时候,通常采用的是redis缓存,全文搜索引擎,数据库本身优化,sql优化,磁盘优化

看如下图:

所以可以得出的思想就是:

这个优化法则归纳为5个层次:
1、 减少数据访问(减少磁盘访问)
2、 返回更少数据(减少网络传输或磁盘访问)
3、 减少交互次数(减少网络传输)
4、 减少服务器CPU开销(减少CPU及内存开销)
5、 利用更多资源(增加资源)

1、减少数据访问
  1.1、创建并使用正确的索引
数据库索引的原理非常简单,但在复杂的表中真正能正确使用索引的人很少,即使是专业的DBA也不一定能完全做到最优。
索引会大大增加表记录的DML(INSERT,UPDATE,DELETE)开销,正确的索引可以让性能提升100,1000倍以上,不合理的索引也可能会让性能下降100倍,因此在一个表中创建什么样的索引需要平衡各种业务需求。
索引常见问题:
索引有哪些种类?
  常见的索引有B-TREE索引、位图索引、全文索引,位图索引一般用于数据仓库应用,全文索引由于使用较少,这里不深入介绍。B-TREE索引包括很多扩展类型,如组合索引、反向索引、函数索引等等,以下是B-TREE索引的简单介绍:
B-TREE索引也称为平衡树索引(Balance Tree),它是一种按字段排好序的树形目录结构,主要用于提升查询性能和唯一约束支持。B-TREE索引的内容包括根节点、分支节点、叶子节点。
叶子节点内容:索引字段内容+表记录ROWID
  根节点,分支节点内容:当一个数据块中不能放下所有索引字段数据时,就会形成树形的根节点或分支节点,根节点与分支节点保存了索引树的顺序及各层级间的引用关系。
一个普通的BTREE索引结构示意图如下所示:


1.2、只通过索引访问数据
  有些时候,我们只是访问表中的几个字段,并且字段内容较少,我们可以为这几个字段单独建立一个组合索引,这样就可以直接只通过访问索引就能得到数据,一般索引占用的磁盘空间比表小很多,所以这种方式可以大大减少磁盘IO开销。
如:select id,name from company where type='2';
如果这个SQL经常使用,我们可以在type,id,name上创建组合索引
create index my_comb_index on company(type,id,name);
  有了这个组合索引后,SQL就可以直接通过my_comb_index索引返回数据,不需要访问company表。
还是拿字典举例:有一个需求,需要查询一本汉语字典中所有汉字的个数,如果我们的字典没有目录索引,那我们只能从字典内容里一个一个字计数,最后返回结果。如果我们有一个拼音目录,那就可以只访问拼音目录的汉字进行计数。如果一本字典有1000页,拼音目录有20页,那我们的数据访问成本相当于全表访问的50分之一。
切记,性能优化是无止境的,当性能可以满足需求时即可,不要过度优化。在实际数据库中我们不可能把每个SQL请求的字段都建在索引里,所以这种只通过索引访问数据的方法一般只用于核心应用,也就是那种对核心表访问量最高且查询字段数据量很少的查询。

1.3、优化SQL执行计划
  SQL执行计划是关系型数据库最核心的技术之一,它表示SQL执行时的数据访问算法。由于业务需求越来越复杂,表数据量也越来越大,程序员越来越懒惰,SQL也需要支持非常复杂的业务逻辑,但SQL的性能还需要提高,因此,优秀的关系型数据库除了需要支持复杂的SQL语法及更多函数外,还需要有一套优秀的算法库来提高SQL性能。
目前ORACLE有SQL执行计划的算法约300种,而且一直在增加,所以SQL执行计划是一个非常复杂的课题,一个普通DBA能掌握50种就很不错了,就算是资深DBA也不可能把每个执行计划的算法描述清楚。虽然有这么多种算法,但并不表示我们无法优化执行计划,因为我们常用的SQL执行计划算法也就十几个,如果一个程序员能把这十几个算法搞清楚,那就掌握了80%的SQL执行计划调优知识。
由于篇幅的原因,SQL执行计划需要专题介绍,在这里就不多说了。

2、返回更少的数据
2.1、数据分页处理
  一般数据分页方式有:
  2.1.1、客户端(应用程序或浏览器)分页
  将数据从应用服务器全部下载到本地应用程序或浏览器,在应用程序或浏览器内部通过本地代码进行分页处理
  优点:编码简单,减少客户端与应用服务器网络交互次数
  缺点:首次交互时间长,占用客户端内存
  适应场景:客户端与应用服务器网络延时较大,但要求后续操作流畅,如手机GPRS,超远程访问(跨国)等等。
  2.1.2、应用服务器分页
  将数据从数据库服务器全部下载到应用服务器,在应用服务器内部再进行数据筛选。以下是一个应用服务器端Java程序分页的示例:
  List list=executeQuery(“select * from employee order by id”);
  Int count= list.size();
  List subList= list.subList(10, 20);

  优点:编码简单,只需要一次SQL交互,总数据与分页数据差不多时性能较好。
  缺点:总数据量较多时性能较差。
  适应场景:数据库系统不支持分页处理,数据量较小并且可控。

2.1.3、数据库SQL分页
  采用数据库SQL分页需要两次SQL完成
  一个SQL计算总数量
  一个SQL返回分页后的数据
优点:性能好
缺点:编码复杂,各种数据库语法不同,需要两次SQL交互。

oracle数据库一般采用rownum来进行分页,常用分页语法有如下两种:

直接通过rownum分页:
select * from (
select a.*,rownum rn from
(select * from product a where company_id=? order by status) a
where rownum<=20)
where rn>10;
数据访问开销=索引IO+索引全部记录结果对应的表数据IO

采用rowid分页语法
优化原理是通过纯索引找出分页记录的ROWID,再通过ROWID回表返回数据,要求内层查询和排序字段全在索引里。
create index myindex on product(company_id,status);

select b.* from (
select * from (
select a.*,rownum rn from
(select rowid rid,status from product a where company_id=? order by status) a
where rownum<=20)
where rn>10) a, product b
where a.rid=b.rowid;
数据访问开销=索引IO+索引分页结果对应的表数据IO

实例:
一个公司产品有1000条记录,要分页取其中20个产品,假设访问公司索引需要50个IO,2条记录需要1个表数据IO。
那么按第一种ROWNUM分页写法,需要550(50+1000/2)个IO,按第二种ROWID分页写法,只需要60个IO(50+20/2);

2.2、只返回需要的字段
通过去除不必要的返回字段可以提高性能,例:
调整前:select * from product where company_id=?;
调整后:select id,name from product where company_id=?;

优点:
1、减少数据在网络上传输开销
2、减少服务器数据处理开销
3、减少客户端内存占用
4、字段变更时提前发现问题,减少程序BUG
5、如果访问的所有字段刚好在一个索引里面,则可以使用纯索引访问提高性能。
缺点:增加编码工作量
由于会增加一些编码工作量,所以一般需求通过开发规范来要求程序员这么做,否则等项目上线后再整改工作量更大。
如果你的查询表中有大字段或内容较多的字段,如备注信息、文件内容等等,那在查询表时一定要注意这方面的问题,否则可能会带来严重的性能问题。如果表经常要查询并且请求大内容字段的概率很低,我们可以采用分表处理,将一个大表分拆成两个一对一的关系表,将不常用的大内容字段放在一张单独的表中。如一张存储上传文件的表:
T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE,FILE_CONTENT)
我们可以分拆成两张一对一的关系表:
T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE)
T_FILECONTENT(ID, FILE_CONTENT)
通过这种分拆,可以大大提少T_FILE表的单条记录及总大小,这样在查询T_FILE时性能会更好,当需要查询FILE_CONTENT字段内容时再访问T_FILECONTENT表。

3、减少交互次数
3.1、batch DML
  数据库访问框架一般都提供了批量提交的接口,jdbc支持batch的提交处理方法,当你一次性要往一个表中插入1000万条数据时,如果采用普通的executeUpdate处理,那么和服务器交互次数为1000万次,按每秒钟可以向数据库服务器提交10000次估算,要完成所有工作需要1000秒。如果采用批量提交模式,1000条提交一次,那么和服务器交互次数为1万次,交互次数大大减少。采用batch操作一般不会减少很多数据库服务器的物理IO,但是会大大减少客户端与服务端的交互次数,从而减少了多次发起的网络延时开销,同时也会降低数据库的CPU开销。
3.2 缓存概念

  通过redis等内存工具将数据库缓存到内存中

3.3 全文搜索 es

  可以将数据进行导入es中进行缓存,然后查询只是在es中查询,可以减少对数据库的交互

 这个是很早之前总结的,一直在有道云笔记上,希望大家拍砖.

 

转载于:https://www.cnblogs.com/xiufengchen/p/10350369.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412325.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[vue] webpack打包vue速度太慢怎么办?

[vue] webpack打包vue速度太慢怎么办&#xff1f; 升级webpack4,支持多进程个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

修复Net4.0在IE11下doPostBack无效的问题

修复在IE10和IE11情况下使用_doPostBack无法提交的问题&#xff0c;需要下载.netFramework4.0进行重新修复 下载地址: http://download.csdn.net/detail/zjstudio/9592565

smartdeblur有手机版吗_《GTA5》高仿手机版问世,更新高清城市地图后你会喜欢吗?...

现在GTA5手游是传的最热火的一款手游了&#xff0c;但R星并没有把这款游戏排在日程上面&#xff0c;我觉得2K的游戏制作速度确实太慢&#xff0c;以至于R星都要亲自去催一下&#xff0c;而且现在是手游的天下&#xff0c;更多的游戏群体都开始在手游端聚集&#xff0c;在未来的…

[vue] vue项目有使用过npm run build --report吗?

[vue] vue项目有使用过npm run build --report吗&#xff1f; 给 process.env 对象添加了一个属性 npm_config_report: "true"&#xff0c;表示开启编译完成后的报告。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一…

Asp.Net集成支付宝当面付接口报ISV权限不足

在使用C#开发支付宝当面付接口时&#xff0c;下载了[官网的Demo] 点此链接进入下载&#xff1a; https://doc.open.alipay.com/doc2/detail.htm?spma219a.7629140.0.0.yNFbBr&treeId193&articleId105201&docType1 使用公司的支付宝商家账号替换好参数后&#xff…

ad采样做按键开关_磐石按键测试机解决各种按键测试问题

随着人民生活水平不断的提高&#xff0c;在使用各类产品的过程中&#xff0c;对手指碰触到的按键要求舒适性越来越高&#xff0c;也就是对产品用户体验的享受度越来越高&#xff0c;对手碰触到的各类按键的要求灵敏度、可靠度、舒适性就非常高&#xff0c;所以现在很多产品在出…

致我的2018 你好2019

我就不置顶了……随便写写的东西就凑活一下吧…… 本人文笔较渣&#xff0c;不适者轻喷。 本文1800字左右&#xff0c;请务必保证入睡前食用。 其实我元旦就想发的&#xff0c;只是在准备PKUWC&#xff0c;没时间&#xff0c;现在补掉好了。 现在我一个人在机房。时间过得真快啊…

[vue] vue在created和mounted这两个生命周期中请求数据有什么区别呢?

[vue] vue在created和mounted这两个生命周期中请求数据有什么区别呢&#xff1f; 看实际情况&#xff0c;一般在 created&#xff08;或beforeRouter&#xff09; 里面就可以&#xff0c;如果涉及到需要页面加载完成之后的话就用 mounted。在created的时候&#xff0c;视图中的…

Asp.Net开通支付宝PC端网页支付

需要对文件夹app_code下的AlipayConfig中的几个参数进行配置&#xff1a; 需要注意&#xff1a;只需要配置partner和private_key两个参数&#xff0c;支付宝的public_key无需更改 private_key是通过openssl工具进行PKCS8格式转换过后的私钥 static Config() {//↓↓↓↓↓↓↓…

巨潮网怎么下载年报_上市公司年报(或财务报表)在哪里下载?

会计专业;财务分析;上市公司;技巧 首先,上市公司财务报表通常指的是三大财务报表:资产负债表 现金流量表 利润表,Excel格式的;当然也有人需要的是PDF格式的完整年度报告,看您具体需要的事哪一种,依照情况选择吧。Excel>> PDF>> 2. 在查询获取上常用的是巨…

2019.02.09 bzoj4455: [Zjoi2016]小星星(容斥原理+dp)

传送门 题意简述&#xff1a;给一张图和一棵树&#xff08;点数都为n≤17n \le17n≤17&#xff09;&#xff0c;问有多少种给树的标号方法方法使得图中去掉多余的边之后和树一模一样。 思路&#xff1a; 容斥好题啊。 考虑fi,jf_{i,j}fi,j​表示把iii对应成原图中的点jjj这棵子…

[vue] 如果让你教一个2-3年经验前端经验的同事使用vue,你该怎么教?

[vue] 如果让你教一个2-3年经验前端经验的同事使用vue&#xff0c;你该怎么教&#xff1f; 直接甩已经有的项目给他 简单说下 vuex router &#xff0c;和项目中常用操作 和注意事项 比如什么时候可以用箭头函数 什么时候不能用 等等 快速上手。。剩下的只能靠自己&#xff0c…

Asp.Net开通支付宝移动端网页支付

第一步&#xff1a;配置参数 需要配置APP_Code文件夹下AlipayConfig文件中的参数&#xff1a; partner、seller_id、private_key三个&#xff0c;其他的参数无需更改。 注意&#xff1a;private_key是使用openssl工具经过pkcs8格式转换过后的私钥 static Config() {//↓↓↓↓…

redis将散裂中某个值自增_0基础掌握Django框架(49)Redis

为了更好的学习效果&#xff0c;请搭配视频教程一起学习&#xff1a;Django零基础到项目实战 - 网易云课堂​study.163.comredis教程&#xff1a;概述redis是一种nosql数据库,他的数据是保存在内存中&#xff0c;同时redis可以定时把内存数据同步到磁盘&#xff0c;即可以将数据…

[vue] 用vue怎么实现一个换肤的功能?

[vue] 用vue怎么实现一个换肤的功能&#xff1f; 这个……全局的theme属性然后做class判断或者加载不同的样式文件。一种是编译时换肤 一种是用户操作换肤。编译时换肤可以通过css in js相关技术修改css预处理器的变量 。用户操作换肤 只能内置一些styleb变量供用户选择了个人…

Matrix PKU 2155

问题描述给定N * N矩阵A&#xff0c;其元素为0或1.A [i&#xff0c;j]表示第i行和第j列中的数字。最初我们有A [i&#xff0c;j] 0&#xff08;1 < i&#xff0c;j < N&#xff09;。 我们可以通过以下方式更改矩阵。给定一个左上角为&#xff08;x1&#xff0c;y1&…

Asp.Net微信发布菜单,出现“invalid sub button url domain hint”错误

在微信后台建立好微信菜单后&#xff0c;调用发布接口进行发布操作时&#xff0c;出现了下面的问题&#xff1a; invalid sub button url domain hint [V85WIa0180vr23] 解决办法&#xff1a; 进入微信公众平台&#xff0c;选择菜单“公众号设置”-》“功能设置”-》“JS接口…

[vue] 说说你对proxy的理解

[vue] 说说你对proxy的理解 vue的数据劫持有两个缺点: 1、无法监听通过索引修改数组的值的变化 2、无法监听object也就是对象的值的变化 所以vue2.x中才会有$set属性的存在proxy是es6中推出的新api&#xff0c;可以弥补以上两个缺点&#xff0c;所以vue3.x版本用proxy替换obje…

Linux小知识(零散)

terminal的起始是用户名主机名&#xff0c;后面是当前工作路径&#xff0c;紧跟着美元符号 $&#xff0c;代表shell提示符。 如果提示符显示的是“#”而不是“$"&#xff0c;则代表该terminal具有超级用户权限。 Gnome 和 KDE 是“桌面系统”&#xff0c;一种很多程序和函…

spring字符串判空_如何判断字符串为空

java中有多种判断String对象思否为空的方法,本文来梳理一下.java原生方法在java原生的语法中,String对象有一个API是isEmpty(),该方法会判断String对象是否为空,这里的isEmpty()完全等同于String.length()0,但是如果这是你的String对象是null呢?--String.isEmpty()就会报空指针…