Android性能优化,MySQL性能优化小结

.NET 品质优化小本领

Redis听到最多的一句话就是Redis的利用难吗?轻易,Redis用好轻松啊?不便于,不经常候感觉那句话说的相当好,但又是让读者挺心里咯噔一下的,还不比不说!

在上一篇中牵线了品质优化的定义、内部存储器泄漏和质量优化措施Android质量优化大家三番两次说说Android质量优化

一.数据库设计和查询优化

Intro

事先做了短信发送速度的升级换代,在大师的点拨下,发送短信的速度有了庞大的晋升,学到了一些升级.NET 品质的一些小技能

概述简要介绍

Redis是八个开源(BSD许可)的内部存款和储蓄器数据结构存储,用作数据库,缓存和消息代理。它帮忙数据结构,如字符串,哈希,列表,集结,具有限定查询的排序集,位图,一流日志和全体半径查询的地理空间引得。Redis具有内置复制,Lua脚本,LRU逐出,交易和见仁见智级其他磁盘悠久性,并经过Redis Sentinel提供高可用性,并透过Redis Cluster自动分区。
往一言以蔽之正是:Redis是三个开源的Key-Value存款和储蓄,它抱有以下特点:

  • 进程特别快(各类人都了解)
  • 累积的数据结构,包含String,List,Hash,Set,Sorted Set等
  • 单线程,免了线程切换和锁的性格消耗(搞不懂,整日研究的面世编制程序在这里间不适用?)
  • 原子操作(作为数据库都有)
  • 可持久化(EscortDB与AOF)
  • 颁发/订阅 (个人以为RabbitMQ这上边可比优越,在微服务RPC调用这里,作服务的觉察)
  • 支持Lua脚本
  • 分布式锁 (集群的非常重要)
  • 事务 (作为数据库都有)
  • 主从复制与高可用(Redis Sentinel)
  • 集群(3.0版本以上)

索引

简轻易单的说,索引就如书本的目录,目录能够便捷找到所在页数,数据库中索引能够帮忙急迅找到数据,而不用全表扫描,合适的目录能够大大进步数据库查询的频率。

. 优点大大加快了数据库检索的进程,包罗对单表查询、连表查询、分组查询、排序查询。通常是一到五个数据级的属性进步,且随着数据数量级拉长。. 短处索引的创造和爱护存在消耗,索引会占用物理空间,且随着数据量的增加而扩大。在对数据库实行增加和删除改时需求珍惜索引,所以会对增加和删除改的质量存在影响。

A.当某字段数据更新频率相当的低,查询频率较高,经常有限定查询(>, <, =, >=, <=)或order by、group by产生时建议选用索引。并且选拔度越大,建索引越有优势,这里选拔度指一个字段中无可比拟值的数额/总量。

B. 常常还要存取多列,且每列都带有重复值可考虑制造复合索引

  • 直接创制索引和直接创造索引直接开立: 使用sql语句创立,Android中能够在SQLiteOpenHelper的onCreate或是onUpgrade中央直属机关接excuSql创立语句,语句如CREATE INDEX mycolumn_index ON mytable 直接创造: 定义主键约束照旧独一性键约束,能够直接创设索引,主键默许为独一索引。
  • 日常索引和独一性索引普通索引:CREATE INDEX mycolumn_index ON mytable 独一性索引:保险在索引列中的全部数额是独步一时的,对聚簇索引和非聚簇索引都得以动用,语句为CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable
  • 单个索引和复合索引单个索引:索引营造语句中仅满含单个字段,如上边包车型地铁平时索引和独一性索引创设示范。复合索引:又叫组合索引,在目录创建语句中还要包罗四个字段,语句如:CREATE INDEX name_index ON username(firstname, lastname),当中firstname为前导列。
  • 聚簇索引和非聚簇索引(集中索引,集合索引)聚簇索引:物理索引,与基表的情理顺序一样,数据值的依次总是依据顺序排列,语句为:CREATE CLUSTERED INDEX mycolumn_cindex ON mytable WITH ALLOW_DUP_ROW,其中WITH ALLOW_DUP_ROW代表同意有重复记录的聚簇索引非聚簇索引:CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable索引默感觉非聚簇索引
  • 对此复合索引,把利用最频仍的列做为前导列。假使查询时前导列不在查询条件中则该复合索引不会被选取。如create unique index PK_GRADE_CLASS on student (grade, class)select * from student where class = 2未采用到索引select * from dept where grade = 3使用到了目录
  • 防止对索引列举办测算,对where子句列的别的计算要是无法被编写翻译优化,都会导致查询时索引失效select * from student where tochar=’2′
  • 比较值幸免选取NULL
  • 多表查询时要细心是选拔稳当的表做为内表。连接条件要充份思量包含索引的表、行数多的表,内外表的挑选可由公式:外层表中的同盟行数
  • 内层表中每次寻找的次数明确,乘积最小为拔尖方案。实际多表操作在被实际实施前,查询优化器会依照一而再条件,列出几组或然的连天方案并从当中寻找系统开采比比较小的一级方案。
  • 查询列与索引列次序一致
  • 用多表连接代替EXISTS子句
  • 把过滤记录数最多的规范化放在最前头
  • 专长运用存款和储蓄进程,它使sql变得更为灵活和火速(Sqlite不援救存款和储蓄进程::>_<:: )

1.Schema规划时入眼怀念:标准化,数据类型,索引.
        一个数据库设计能够勾兑使用,一部分表格规范化,一部分报表非标准化.(非标准化表格适当冗余)
        最优的数据类型,使表在磁盘上据有的空间尽可能小,读写快,占用内部存储器少.(索引也硬着头皮组建在比较小的列上)
        精确索引,进步Select,Update,Delete质量.
2.不及的Sql分裂的优化方案
        Explain Sql查看结果,剖判查询.
        查询利用十一分的类型.
        使用long-slow-queries记录非常慢查询,深入分析优化.

HttpClient 优化

关于使用 HttpClient ,大约比很多少人都知情尽量利用单例以晋级 HttpClient 的性能。

由于 HttpClient 在出殡和下葬央求时须求开展域名深入分析,使用的时候第一遍平常的话会慢一些,大家在 HttpClient 初叶化达成之后,向目标地址发送二个 HEAD 央浼,那样会把域名剖析结果有叁个缓存,实际去央浼的时候所需用的域名深入分析的时刻就能够压缩了,那样就可以提高第二回实际上发送央求的快慢。

HttpClient 的过期时间设置尽量短避防止超长等待升高响合时间

Redis数据结构

建议直接看Redis官方网站的数据结构,因为尚未想看二手Redis数据结构,这里大致介绍:

  • String
    那是最简易的Redis类型。假使只行使这种类型,Redis就疑似一个可持久化的Memcached服务器。
  • List
    Redis的List是根据双向链表达成的,能够支撑反向搜索和遍历。
    常用案例:聊天系统、社交互联网中获得客户最新刊登的帖子、轻松的消息队列、音信的分页列表、博客的评头品足系统。
  • Hash
    Hash是贰个String类型的田野和value之间的映射表,请见下图,类似于.NET中的Hashtable和Dictionary。重要用来囤积对象,能够制止种类化的花费和产出修改决定的难题。
  • Set
    Set也是三个列表,可是它的出格之处在于它是能够自动排重的:当需求仓库储存二个列表数据,而又不期待出现重复的时候,Set是多少个很好的挑选(举例ID的汇集)。并且Set提供了判定有个别成员是不是在二个Set群集内的接口,那也是List所没有的。
  • Sorted Set
    Sorted Set和Set的施用景况类似,分歧是Sorted Set会基于提供的score参数来进展自动排序。当你需求贰个静止的还要不另行的会晤列表,那么就可以选取Sorted Set数据结构。常用案例:游戏中的排行的榜单。

事务

运用工作的两大好处是原子提交和更优质量。

原子提交代表同一业务内的富有修改只怕都产生或然都不做,假使有个别修改退步,会活动回滚使得全部修改不奏效。

Sqlite暗中同意会为每种插入、更新操作创立一个专门的学问,并且在每趟插入、更新后立即付给。

那样倘诺总是插入玖15次数据实际上是开创专业->推行语句->提交这一个历程被重复实行了玖拾捌次。固然大家显式的开创专门的学问->施行100条语句->提交会使得那几个创建筑工程作和提交那个进程只做贰回,通过这种贰回性事务能够使得品质大幅晋级。越发当数据库位于sd卡时,时间上能省掉三个数据级左右。

Sqlte显示选择专门的学问,示例代码如下:

public void insertWithOneTransaction() { SQLiteDatabase db = sqliteOpenHelper.getWritableDatabase(); //开始一个事务 db.beginTransaction(); try { for (int i = 0; i < 100; i  ) { db.insert(yourTableName, null, value); } // 设置当前事务成功 db.setTransactionSuccessful(); } catch (Exception e) { e.printStackTrace(); } finally { //结束事务 db.endTransaction(); }}

内部sqliteOpenHelper.getWritableDatabase()表示收获写表权限。

二.劳动器端优化

同步操作优化

本来的同步操作,能够改为异步管理的运用异步方法管理,

如查询数据库等操作很多可以改为异步操作,裁减线程阻塞,进一步升高 CPU 的利用率。

七个任务的调解,能够不供给关心三个任务调解的话就能够并且运维义务并且不要等待。

Redis主要特色

  • 管道
    Redis服务是一种C/S模型,提供乞求-响应式左券的TCP服务,所以当顾客端恳求发出,服务端管理并赶回结果到客商端,日常是以堵塞方式等待服务端的响应,但那在批量拍卖连接时延迟难点比较严重,所以Redis为了提高或弥补那些难题,引进了管道技巧:可以成功服务端未立时响应的时候,客户端也得以持续发送命令必要,做到客商端和服务端互不干涉影响,服务端并最终回到全数服务端的响应,那在推动原有C/S模型交互的响应速度上有了质的加强。
    天性:在C/S交互中,客商端可发送任意数请求命令,不供给等服务端响应后再行发送需要;而服务端能够叁遍性完成并回到全数顾客端央浼结果,也能够分批次回到央求结果,那根本看服务端管理结果的快慢而定。
  • 事务
    Redis事务是一组命令的聚集。四个事务中的命令要么都施行,要么都不实行。假设命令在运作时期出现谬误,不会自动回滚。
    管道与业务的分别:管道首要是互联网上的优化,顾客端缓冲一组命令,一次性发送到服务器端试行,可是并不能够确认保障命令是在同三个业务里面推行;而事情是原子性的,能够确定保证命令推行的时候不会有来自其余客户端的指令插入到命令系列中。

其他Sqlite的优化

  • 话语的拼凑使用StringBuilder代替String轻巧的String相加会导致创设八个一时对象消耗品质。StringBuilder的空间预分配质量好得多。借使您对字符串的尺寸有概略精晓,如100字符左右,能够直接new StringBuilder内定起首大小,减弱空间远远不足时的双重分配。
  • 查询时再次来到更加少的结果集及越来越少的字段。查询时只取必要的字段和结果集,更加多的结果集会消耗更加多的时间及内部存款和储蓄器,越来越多的字段会促成越多的内部存款和储蓄器消耗。
  • 少用cursor.getColumnIndex依照品质调优进度中的阅览cursor.getColumnIndex的年华消耗跟cursor.getInt相差无几。能够在建表的时候用static变量记住某列的index,间接调用相应index实际不是历次查询。
public static final String HTTP_RESPONSE_TABLE_ID = _ID;public static final String HTTP_RESPONSE_TABLE_RESPONSE = "response";public List<Object> getData() { …… cursor.getString(cursor.getColumnIndex(HTTP_RESPONSE_TABLE_RESPONSE)); ……}//优化为 public static final String HTTP_RESPONSE_TABLE_ID = _ID;public static final String HTTP_RESPONSE_TABLE_RESPONSE = "response";public static final int HTTP_RESPONSE_TABLE_ID_INDEX = 0;public static final int HTTP_RESPONSE_TABLE_URL_INDEX = 1;public List<Object> getData() { …… cursor.getString(HTTP_RESPONSE_TABLE_RESPONSE_INDEX); ……}

1.设置适当的MySql版本. 假设服务器使用AMD处理器,使用IntelC 版本可巩固30 %功用

数据结构优化

在利用相当多的 Model 处考虑 Model 中是还是不是有比较多的无用字段,假设有能够设想用三个新的轻量级的 Model ,优化 Model 数据结构优化内部存款和储蓄器存款和储蓄。

分布应用难点

  • 缓存穿透管理
    怎么是缓存穿透?当依据Redis key在缓存中查询后,不设有对应Value,就应当会在后端系统如DB中去研究,该Key的产出诉求量一旦变大,那么就能够对DB产生非常大的下压力。消除办法有:a.前端风险调整,将恶意穿透情况解决在外;b.对查询结果为空的动静依旧实行缓存,但缓存时间会设置得非常短,常常是几分钟。
  • 缓存雪崩管理
    怎么是缓存雪崩?当缓存服务珍视启大概大量缓存集中在某贰个时刻段失效,那样在失效的时候,也会给后端系统(举例DB)带来非常大压力。消除办法有:后端连接数限制,错误阈值限制,超时管理,缓存失效时间均匀遍布,前端永不失效及后端主动立异。
  • 缓存时间长度
    计策定位复杂,要求多维度的计量。
  • 缓存失效
    有效期失效,事件失效,后端主动立异。
  • 缓存Key
    Hash、准绳、前缀 Hash,十分意况可人工干预。
  • Lua脚本
    服务端批量甩卖及作业才干,有条件逻辑的可扩张脚本。使用它的好处有:减少网络开垦、原子操作、可复用。
  • Limit
    可滑动时间窗口,如运用于Session,Memcached需每一回传Key和Value。

异步线程

Sqlite是常用于嵌入式开拓中的关系型数据库,完全开源。与Web常用的数据库Mysql、Oracle db、sql server分裂,Sqlite是叁个内嵌式的数据库,数据库服务器就在你的程序中,无需网络布局和管理,数据库服务器端和客商端运维在平等进度内,收缩了互联网访谈的损耗,简化了数据库管理。可是Sqlite在出现、数据库大小、网络方面存在局限性,而且为表级锁,所以也没要求三十二线程操作。

Android中数据少之甚少时表查询或许耗时十分少,不会促成ANRubicon,可是超过100ms时同样会让客户感到到延时和卡顿,能够放在线程中运转,但Sqlite在出现方面存在局限,十六线程调控较劳碌,那时候可应用单线程池,在职分中实行db操作,通过Handler重临结果和UI线程交互,既不会影响UI线程,同一时候也能幸免出现带来的老大。

可选拔Android提供的AsyncQueryHandler或临近如下代码实现:

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();singleThreadExecutor.execute(new Runnable() { @Override public void run() { db.insert("你的表名", null, value); handler.sendEmptyMessage;

二个网络诉求能够大致分为连接服务器 -> 获取数据多个部分。个中连接服务器前还包罗DNS深入分析的进程;获取数据后也许会对数码举办缓存。

  1. 布局优化. 常见优化项:
            charset
            max_allowed_packet
            max_connections
            table_cache_size
            query_cache_size

缓存

重复使用的值缓存起来(依照数据须求选择接纳缓存类型,变量缓存或内存缓存或redis等分布式缓存),减少数据库查询次数

Redis简要介绍安装(Centos)

下载地址,建议生产条件使用牢固版
1、 确定保障已经安装有编写翻译工具make

图片 1

向来不安装make能够采纳:

yum install make -y

2、初始安装
RedisDesktopManage:页面效果:

图片 2

RedisDesktopManage下载地址:https://redisdesktop.com/
Redis官网:https://redis.io/
Redis安装推荐博客:http://blog.csdn.net/lc1010078424/article/details/78295482
多多别样博客写的是的确垃圾!

连接服务器优化计策

节约 DNS 深入分析进程,DNS 全名 Domain Name System,分析意指依照域名获得其相应的 IP 地址。如: 的域名剖析结果正是104.236.147.76。

第一遍域名剖判日常须要几百纳秒,可通过一贯向IP而非域名诉求,节省掉那有个别日子,同期能够幸免域名吓唬等带来的高风险。

理当如此为了安全和强盛怀恋,这些IP大概是二个动态更新的IP列表,并在IP不可用情状下通过域名访谈。

相称地方谈到的动态 IP 列表,扶助优先级,每趟根据地面、互连网项目等选用最优的服务器IP举行连接。对于服务器端还足以调优服务器的TCP拥塞窗口大小、重传超时时间、最大传输单元等。

三.存款和储蓄引擎优化

Sql 优化

  1. 只要供给同期插入大多多少,尽恐怕选择 BulkCopy 操作以进级质量

  2. 更新/查询条件优化,使用更加精确的标准,尽大概接纳主键查询和更新

  3. 批量更新数据的一再操作能够合併为叁次操作的就联合为一次操作,不可能合为一遍操作就贰次提交,注意防 Sql 注入

  4. 复杂 Sql 使用事务时,能在 Sql 中运用工作就在Sql中运用不然在代码中行使。使用事务时仅在急需开启事务的地点开启事务,事务截至就付出业务,不要在事情中混杂不必要放在职业中拍卖的数据库操作

获取数据优化战术

节省连接建霎时间,如开启keep-aliveHttp 1.1 暗中认可运行了keep-alive。对于Android来讲暗中同意景况下HttpU途乐LConnection 和HttpClient都张开了keep-alive。

别的网络需要框架也得以进行相应计划

将在三个恳求合併为八个人展览馆开呼吁,相比较普及的正是网页中的CSS Image Coca Colas。 要是某些页面内央求过多,也得以虚构做分明的乞求合併。

  • 对于 POST 请求,Body 可以做 Gzip 压缩,如日志。

  • 对央浼头实行削减这一个http 1.1不辅助,spdy及http 2.0帮忙。http 1.1 能够经过服务端对前贰个诉求的呼吁头进行缓存,前面同样央求头用md5之类的id来表示就可以。

缓存常见的图纸、JS、CSS 等静态财富。

  • 缩减一般API数据运用Gzip压缩
  • 切中要害数量格式如JSON代替 XML,WebP代替别的图片格式
  • 对此差别的配备分化网络再次来到分化的始末 如区别分辨率图片大小。
  • 增量更新须求多少更新时,可思考增量更新。如周围的服务端举行bsdiff,顾客端进行bspatch。
  • 大文件下载扶助断点续传,并缓存Http Resonse的ETag标志,后一次恳请时带上,进而明确是不是数据变动过,未变动则直接重返304。

缓存获取到的多少,在必然的有用时间内再次恳请可以向来从缓存读取数据。

方今的网络央浼框架都可进展对应的缓存配置

今日礼拜六,就说那样多,祝我们周日Happy

    MyISAM
        引擎特点
            不支持工作,提供便捷存款和储蓄,检索以至全文字笔迹核准索工夫.
            宕机缘破坏表.
            使用的磁盘和内部存款和储蓄器空间小.
            基于表的锁,并发更新数据会油然则生严重质量难题.
            MySql只缓存索引,数据由OS缓存.
        适用景况
            日志系统.
            只读操作依然超越56%读操作.
            全表扫描.
            批量导入数据.
            未有专门的学业的低并发读写.
        优化攻略
            NOT NULL,能够削减磁盘存款和储蓄.
            Optimize Table,碎片整理,回收空闲空间.
            Deleting/updating/adding多量多少的时候禁止使用index.
            参数优化,key_buffer_size_variable索引缓存设置.
            制止并发Inset Update.
    InnoDB
        引擎特点
            具有提交,回滚和崩溃恢复本领的政工安全存款和储蓄引擎.
            管理庞大数据量品质优良,它的CPU使用效能特别高.
            须要越来越多的内部存储器和磁盘存款和储蓄空间.
            数据和目录都缓存在内部存款和储蓄器中.
        适用情状
            须求工作的应用.
            高并发的应用.
            自动苏醒.
            较便捷的根据主键的操作.
        优化攻略
            尽量利用short,integer的主键.
            使用prefix keys,因为InnoDB未有key压缩功用.
            参数优化,innodb_buffer_pool_size,innodb_data_home_dir等等.

End

谢谢大师,跟着法师张开二遍质量优化,确实学到相当多,本人对有个别概念也是知道的更为深刻了。

三. 缓存优化

1.Memcached
2.Redis

转载自:

本文由星彩网app下载发布于计算机编程,转载请注明出处:Android性能优化,MySQL性能优化小结

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。