精华内容
下载资源
问答
  • 2019-10-23 20:03:25

    一、free 命令

    通过 free 命令查看系统的内存使用情况,内存大小单位为 KB,执行结果如下图所示:
    free
    通过 free -m 命令查看系统的内存使用情况,内存大小单位为 MB,执行结果如下图所示:
    free -m
    通过 free -g 命令查看系统的内存使用情况,内存大小单位为 GB,执行结果如下图所示:
    在这里插入图片描述

    二、实际可用内存大小计算

    从上方的图片得知, free 命令执行完成后,会显示 MemSwap 两行数据,其中 Mem 表示物理内存的使用情况,Swap 表示 Swap 分区的使用情况。

    什么是 Swap 分区?
    Swap 分区是操作系统在硬盘上开辟的一块空间,当物理内存块被耗尽时,系统会将一些长时间没有使用的进程的内存转移到 Swap 分区;当物理内存被释放后,Swap 区的数据会随着进程的使用逐步回到物理内存中。

    1、Mem 属性说明见下表:

    属性属性值说明
    total8192MB总物理内存大小
    used601MB已使用物理内存大小
    free3998MB未分配物理内存大小
    shared0MB共享的物理内存大小
    buff/cache3591MB为了提高系统的读写速度(包含磁盘快的读写,文件 inode 的读写等),操作系统将部分内存作为缓存使用,该数值为缓存占用的物理内存大小
    available3998MB可用的物理内存大小,具体计算方法见:provide estimated available memory

    2、Swap 属性说明见下表:

    属性属性值说明
    total0MBSwap 分区的总大小
    used0MB已使用的 Swap 分区大小
    free0MB未使用的 Swap 分区大小

    3、不考虑 Swap 分区
    根据上表,在不考虑 Swap 分区的情况下,内存计算如下:
    总内存大小:Mem.total = Mem.used + Mem.free + Mem.shared + Mem.buff/cache
    理论上实际可用内存大小:Mem.actual = Mem.total - Mem.used - Mem.shared = Mem.free + Mem.buff/cache

    4、考虑 Swap 分区
    根据上表,在考虑 Swap 分区的情况下,内存计算如下:
    总内存大小:Mem.total = Mem.used + Mem.free + Mem.shared + Mem.buff/cache
    理论上实际可用内存大小:Mem.actual = Mem.total - Mem.used - Mem.shared + Swap.free = Mem.free + Mem.buff/cache + Swap.free

    5、系统建议的可用大小 available
    available 官方定义:

    MemAvailable: An estimate of how much memory is available for starting new applications, without swapping. Calculated from MemFree, SReclaimable, the size of the file LRU lists, and the low watermarks in each zone. The estimate takes into account that the system needs some page cache to function well, and that not all reclaimable slab will be reclaimable, due to items being in use. The impact of those factors will vary from system to system.

    available 翻译:

    memavailable:它是一个估计值,在不考虑 Swap 分区的情况下,估算有多少内存可用于启动新的应用程序。根据 memfree、可回收的page cache、slab cache、LRU队列的大小以及每个区域中的低水位线进行计算。该估计考虑到系统需要一些 page cache 才能正常运行,而且由于某些程序正在使用,并非所有可回收的 slab 都可以回收。这些因素的影响因系统而异。

    available 计算公式见下图:
    在这里插入图片描述
    公式概括为:
    Mem.available = Mem.free + PageCache.size + SlabCache.size - WaterMark.low

    属性属性值说明
    PageCache.size0MB可以回收的 PageCache 大小,计算公式见上图
    SlabCache.size0MB可以回收的 SlabCache 大小 ,计算公式见上图
    WaterMark.low0MB支持系统使用的最低水位线,计算公式见上图

    因此在不考虑 Swap 分区的情况下,建议通过 available 参数判定系统的实际可用内容。文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

    参考资料

    1.Linux Page Cache机制,Page Cache、Slab Cache
    2.Linux Page Cache的工作原理
    3.Linux内存管理 (25)内存sysfs节点解读
    4.Linux free命令前后变化和available内存
    5.linux free 命令下free/available区别
    6.index : kernel/git/torvalds/linux.git

    更多相关内容
  • Tg的测试方法以及影响因素揭秘

    千次阅读 2019-12-26 17:55:53
    分析了板材Tg对PCB可靠性的影响,以及Tg的影响因素。 非晶态高分子存在三种力学状态,即玻璃态、高弹态与粘流态。Tg(高分子玻璃化转变温度)即高分子玻璃态与高弹态转变的对应温度。Tg的高低与PCB成品性能...

    一博科技自媒体高速先生原创文

    覆铜板Tg 测试普遍采用差分扫描量热仪法(DSC:DIFferential Scanning Calorimeter Mechanical Analysis)、热机械分析法( TMA:Thermal Mechanical Analysis )和动态热机械分析法( DMA:Dynamic Mechanical Analysis)。该文对三种Tg测试方法、测试原理及各自优劣进行了比较;分析了板材Tg值对PCB可靠性的影响,以及Tg的影响因素。

    非晶态高分子存在三种力学状态,即玻璃态、高弹态与粘流态。Tg(高分子玻璃化转变温度)即高分子玻璃态与高弹态转变的对应温度。Tg值的高低与PCB成品性能息息相关,Tg值越高的PCB成品的稳定性、可靠性、耐热性、抗化性(指在PCB制成时多种化学药水浸泡后,性能保持程度)就会越优良,热膨胀系数也会越低。

    测试原理及方法
    01
    1.1 DSC测试法(图1):

    在这里插入图片描述
    *图1 DSC Q20

    在控温的程序下,测量样品的转移温度,并测量在转移过程中所发生的热流变化与时间及温度的函数关系。在设定的升温(或降温)过程中,仪器的控温系统将两者于测试的过程中一直保持相同的温度,当待测物发生吸热(放热)反应时,待测物一侧的测温器会侦测出因吸热(放热)反应时造成此处的温度较标准物侧的温度低(高),因此,待测物端的加热系统会较标准物侧的加热系统额外的多输入(减少)一些热量(以电流或电压的变化),以增加(减少)待测物的温度,如此可以保持两者的温度一致。而在测试的过程为保持两者温度相同,其所需在待测物端的额外增加或减少热量就是待测物在测试过程中由于反应所造成的实际热量变化。因此DSC可以用做反应或相变化等的定性及定量的实验。

    1.2:TMA测试法(图2):
    在这里插入图片描述
    *图2 TMA Q400

    在加热炉或环境箱内对高分子聚合物的试样施加恒定载荷,记录不同温度下的温度-变形曲线。类似于膨胀计法,找出曲线上的折点所对应的温度,即为玻璃化转变温度。

    1.3:DMA测试法(图3)
    在这里插入图片描述
    *图3:DMA Q800

    动态力学性能分析法(DMA):通过在受测高分子聚合物上施加正弦交变载荷获取聚合物材料的动态力学响应。对于弹性材料(材料无粘弹性质),动态载荷与其引起的变形之间无相位差(ε=σ0sin(ωt)/E)。当材料具有粘弹性质时,材料的变形滞后于施加的载荷,载荷与变形之间出现相位差δ:ε=σ0sin(ωt+δ)/E。将含相位角的应力应变关系按三角函数关系展开,定义出对应与弹性性质的储能模量G’=Ecos(δ)和对应于粘弹性的损耗模量G”=Esin(δ), E因此称为绝对模量E=sqrt(G’2+G”2),由于相位角差δ的存在,外部载荷在对粘弹性材料加载时出现能量的损耗。粘弹性材料的这一性质成为其对于外力的阻尼。阻尼系数γ=tan(δ)=G’’/G’‘’,由此可见,高分子聚合物的粘弹性大小体现在应变滞后相位角上。当温度由低向高发展并通过玻璃化转变温度时,材料内部高分子的结构形态发生变化,与分子结构形态相关的粘弹性随之变化。这一变化同时反映在储能模量,损耗模量和阻尼系数上。阻尼系数的峰值对应着材料内部结构的变化,相应的温度即为玻璃化转变温度。

    1.4:测试对比

    从样品上来说:DSC 测试时,制备的样品为小、薄以增大与坩埚的接触面积,达到利于样品内部热传导作用。DMA 测试时,样品表面要平整,材质均一,尺寸规范。低温测试时,为保证夹具与样品的贴合性,需进行夹具的重新夹紧过程 ,TMA测试时要求样品小于4.5mm表面平整材质均一,样品制备最为简单。

    在这里插入图片描述

    图4是DSC、DMA和TMA的Tg测试曲线。由图可以看出,DMA曲线较DSC 变化细节更加明显,并且还能观察出材料的次级转变等精细结构。两种测试方法都受控于升温、降温、恒温等温度程序,都属于热分析技术,可以对比△Tg值;但TMA 仅适用于单种Tg值,测试结果偏低,我们在使用TMA测试Tg时结果多为参考,不做为理论依据。DSC方法获得的信息是表征样品的热性能和组成,是热性质变化,Tg反映材料在热作用下的内质变化,对材料制备工艺具有指导意义。

    Tg值与PCB可靠性
    02
    在这里插入图片描述
    *图4 测试样品为ITEQHigh Tg无卤素覆铜板(无铜)

    高Tg板材制作的PCB在稳定性和可靠性方面表现较普通Tg和中Tg的PCB更优 。(1)高耐热性:降低因温度而产生的翘曲,可减少PCB在热熔焊接和热冲击时焊盘的翘起。(2)低热膨胀系数(低CTE),减少因热膨胀造成孔拐角铜断裂,特别在八层及八层以上的PCB板中,镀通孔的可靠性能比普通Tg的 PCB板要好 。(3) 抗化性优 ,在湿流程诸多的化学药水浸泡下 , 其性能仍然较佳。

    2.1.Tg值对PCB板的影响

    DSC与DMA测试中得到的△Tg值反映了板料树脂固化程度的高低 , △Tg值越大 , 说明聚合物分子间的交联反应程度越低,板料中存在的极性基团较多,从而使板料极易吸水,这种压板中潜在的缺陷随着时间的延长,PCB板吸水越多,在客户做热冲击测试时,往往会出现爆板,导致严重可靠性问题。△Tg值越大的板料 , 在钻孔加工中 , 易出现孔粗、甩铜、且镀通孔的品质也会变差,因为固化不足的树脂热膨胀变化较大,易出现孔拐角断裂。

    表2:Tg值对PCB可靠性影响
    在这里插入图片描述
    备注:高速先生建议8层及以上时使用TG≥170℃,TD≥340℃。

    Tg影响因素
    03
    3.1.PCB加工过程对Tg值影响

    板料Tg在PCB流程中主要应从以下几方面加以控制 。首先开料烘板 , 温度不宜太高,低于Tg值温度10℃比较好. (如一般High Tg高速材料170℃/4小时条件烘板) ,主要释放残留在板中的内应力、去水份、促进板料中的树脂进一步固化 。其次棕化后烘板,棕化过的板经过湿流程药水的浸泡,板料吸收了一定的水份,如果水份残留在板中,会影响压板品质,影响板料Tg值,因此棕化后必须烘板(120℃/1小时)。压板的PP(prepreg)在贮存期间吸收了一定的水份,这些水份残留在聚合物的分子链间极难在热压中排出,如果不抽湿则压板极易出现爆板、分层等不良压板缺陷,因此也将影响Tg值的大小, 在压前必须抽湿。

    3.2 吸水对Tg的影响

    板材在热压中,聚合物间的交联反应不可能完全的进行,因此板中存在着极性基团,这些基团易吸水 ,吸水后不能真实地反映板料Tg值 。因此在进行Tg测试前应将样品在105℃的环境下烘烤2小时,以去除水份。

    参考文献:
    [1]张晓玲,胡昌飞等.生胶玻璃化转变温度( Tg)DSC /DMA 测试方法比较探讨[J].材料开发与应用1003- 1545( 2018) 04-0100-05
    [2]付丽红. 板材Tg的意义及在流程中的变化与控制[J]//铜箔与基板2002.10
    [3] 楼倩,郑焕军.动态热机械分析法测量 PCB 玻璃化转变温度的研究[J]. 电子产品可靠性与环境试验2019 年8月第37卷第4期

    展开全文
  • 例:某小麦品种经过4代选育,从第5代和第6代中分别抽出10株得到它们株高的观测分别为66,65,66,68,62,65,63,66,68,62和64,61,57,65,65,63,62,63,64,60,试检验株高这一性状是否已达到稳定(α=...

    EverydayOneCat

    📦🙀正方?圓滾?

    🛏️💤🐈💨

    img

    知识点

    1.笔记

    image-20200715180412598

    2.两个正态总体的检验

    例:某小麦品种经过4代选育,从第5代和第6代中分别抽出10株得到它们株高的观测值分别为66,65,66,68,62,65,63,66,68,62和64,61,57,65,65,63,62,63,64,60,试检验株高这一性状是否已达到稳定(α=0.05)?

    思路:先检验方差后检验均值

    SAS代码:

    data ex;
    input c$ x@@; 
    cards; 
    a 66 a 65 a 66 a 68 a 62 a 65 a 63 a 66 a 68 a 62
    b 64 b 61 b 57 b 65 b 65 b 63 b 62 b 63 b 64 b 60
    ;
    proc ttest;class c;var x;
    run;
    

    ttest表示T检验,检验两个水平的,每个水平的都符合正态分布。
    class表示分类变量(属性)

    先看方差检验image-20200714152255750

    Pr>F概率大于0.05,接受原假设H0:方差相等

    再看均值检验image-20200714152736104

    T检验概率比0.05小,拒绝原假设,认为两均值不等,第五代和第六代株高有显著性差异,说明株高性状没有达到稳定。

    3.两组样本非参数检验

    非参数检验(non-parametric test)又称为分布自由检验,一种与总体分布状况无关的检验方法,它不依赖于总体分布的形式。

    3.1配对样本数据符号检验法

    例1 甲乙两人分析同一物质中某成份的含量,得到观测数据(单位:g)为
    甲14.7,15.0,15.2,14.8,15.5,14.6,14.9,14.8,15.1,15.0
    乙14.6,15.1,15.4,14.7,15.2,14.7,14.8,14.6,15.2,15.0
    试在显著性水平为0.05时用符号检验法检验两人的分析无显著差异.

    SAS代码:

    data ex; /*ex为数据名*/
    input x1 x2 @@;
    y=x1-x2; /*y用于存放x1和x2的差值*/
    cards; /*数据卡*/
    14.7 14.6 15.0 15.1 15.2 15.4 14.8 14.7 15.5
    15.2 14.6 14.7 14.9 14.8 14.8 14.6 15.1 15.2
    15.0 15.0
    ;
    proc univariate;/*proc univariate表示调用模块
    univariate*/
    var y; /*var y表示调用变量y*/
    run; /*执行命令*/
    

    image-20200714154944835

    结果分析: 由Tests for Location: Mu0=0表可知,M(Sign)的值为05,pr>M的值为1.00>0.05,未落在拒绝域里,故接受原假设H,认为两人的分析无显著差异。

    3.2总体中位数的符号检验法

    为了判断某个总体的中位数是否与已知数m有显著的差异

    例2 试验品种猪在17个试验点的月增重(单位:kg)见表:image-20200714155348649

    试问,月增重与35是否有显著性差异?

    SAS代码:

    data ex;
    input x @@;
    y=x-35; /*x的值与35的差值作为观测变量值*/
    cards;
    51 40 43 48 23 26 30 34
    25 40 41 39 42 40 43 30
    34
    ;
    proc univariate;var y;
    run;
    
    image-20200714155427479

    结果分析:M(Sign)的值为1.5,Pr >= |M|值为0.6291>0.05,故未落在拒绝域里,因此接受原假设,认为该品种猪月增重的中位数与35无显著差异。

    3.3成组样本数据的秩和检验法

    例3 测定两个马铃薯品种的淀粉含量(%),得到A品种的观测值为12.6, 12.4,B品种的观测值为12.4,12.1,12.5,12.7,12.6,13.1试在显著性水平为0.05时用秩和检验法检验两品种的淀粉含量无显著差异。

    这里一个2个一个6个不是一一配对,我们用到秩和检验法。

    SAS代码:

    data ex;
    do a=1 to 2;
    	input n @@;/*a因素有两个水平,由于每个水平样本个数不等,故先输入表示样本个数的变量n*/
    	do i=1 to n;input x @@;/*每个水平样本从1输到n,再输入数据x*/
    		output;
    	end;
    end; /*计算公式两连加号*/
    cards;
    2 12.6 12.4
    6 12.4 12.1 12.5 12.7 12.6 13.1
    ;
    proc npar1way wilcoxon;
    /*调用模块npar1way,数据对因素a的秩和检验模型*/
    class a;
    var x;
    run;
    

    image-20200714160526073

    结果分析:

    Kruskal-Wallis Test这一部分,自由度DF为1,Chi-Square value 为Chi-Square且Prob > Chi-Square 为0.7358>0.05,接受原假设H0,认为两品种的淀粉含量没有显著性差异,淀粉含量相同。

    4.单因素方差分析

    例4《切胚乳试验》用小麦种子进行切胚乳试验,设计分3种处理,同期播种在条件较为一致的花盆内,出苗后每盆选留2株,成熟后测量每株粒重(单位:g),得到数据如下:

    处理每株粒重
    未切去胚乳21,29,24,22,25,30,27,26
    切去一半胚乳20,25,25,23,29,31,24,26,20,21
    切去全部胚乳24,22,28,25,21,26

    分析粒重和处理方式是否有关。

    SAS代码:

    data ex;do a=1 to 3;input n @@;
    do i=1 to n; input x @@;
    Output;end;end;
    Cards;
    8 21 29 24 22 25 30 27 26
    10 20 25 25 23 29 31 24 26 20 21
    6 24 22 28 25 21 26
    ;
    proc anova; class a;model x=a;
    means a/duncan;run;
    

    image-20200715103902339

    根据此做出来表格:

    image-20200715104517660

    F值为0.32,Pr>F概率大于0.05,接受原假设:均值相等

    image-20200715104323739

    都归属于A类,没有显著性差异,认为不同的处理方式对粒重并无明显影响。

    5.双因素方差分析

    5.1不考虑交互作用

    image-20200715110419416

    SAS代码:

    data ex;do a=1 to 4;do b=1 to 5;
    input x @@;output;end;end;
    cards;
    53 56 45 52 49 47 50 47 47 53 57 63 54 57 58 45 52
    42 41 48
    ;
    proc anova;class a b;model x=a b;
    means a/duncan;means b/duncan;run;
    
    image-20200715110558984 image-20200715111320460 image-20200715110916972 image-20200715111025910

    5.2考虑交互作用

    image-20200715112115832

    要是研究交互作用,每个交叉处至少有两个值。

    data ex;do a=1 to 4;do b=1 to 3;do i=1 to 2;
    input x @@;output;end;end;end;
    cards;
    58.2 52.6 56.2 41.2 65.3 60.8
    49.1 42.8 54.1 50.5 51.6 48.4
    60.1 58.3 70.9 73.2 39.2 40.7
    75.8 71.5 58.2 51 48.7 41.4
    ;
    proc anova;class a b;model x=a b a*b;
    means a/duncan;means b/duncan;run;
    
    image-20200715112400052 image-20200715114515316

    6.多组独立样本的非参数检验

    多组独立样本的H检验法(又称为Kruskal -Wallis单向秩次方差分析法),是检验多组独立样本是否来自同分布总体最常用、功效最强的非参数检验方法。

    例 用3种不同的药剂处理水稻种子,发芽后观测到苗高(单位:cm)的观测值如下,试作单向秩次方差分析。

    image-20200715143801902
    data ex;do a=1 to 3;
    do i=1 to 4;input x @@;
    output;end;end;
    cards;
    21 24 27 20 20 18 19 15 22 25 27 22
    ;
    proc npar1way wilcoxon;
    /*参数第一种方式检验*/
    class a;var x;run;
    

    7.独立性检验

    image-20200715144143257

    原假设H0:是否使用预防措施与患感冒情况相互独立。

    编写程序如下:

    data ex;do a=1 to 2;do b=1 to 3; /*两行三列*/
    input f @@;output;end;end; /*输入样本数*/
    cards;
    224 136 140 252 145 103
    ;
    proc freq;weight f;
    tables a*b/chisq; /*chisq表示检验*/
    run;
    

    image-20200715144301276

    第二部分Statistics for Table of a by b才是检验结果。其中主要看Chi-Square(卡方)这一行,其自由度为2,χ2(Chi-Square value)=7.5691,且Prob值为0.0227<0.05,故落在拒绝域,接受备择假设,即预防与感冒这两因素之间不是相互独立的,即措施对患感冒是有关系的。

    8.协方差分析

    如果在单因素、双因素或多因素试验中有无法控制的因素x影响试验的结果Y,且x可以测量、x与Y之间又有显著的线性回归时,常常利用线性回归来矫正Y的观测值、消去x的差异对Y的影响。

    例如,研究施肥对苹果树产量的影响,由于苹果树的长势不齐,必须消去长势对产量的影响。又如,研究饲料对动物增重的影响,由于动物的初重不同,必须消去初重对增重的影响。

    8.1单因素协方差分析

    image-20200715174111343

    SAS代码:

    data ex; do a=1 to 3;do i=1 to 8;
    input x y @ @;output ;end;end;
    cards;
    47 54 58 66 53 63 46 51 49 56 56 66 54 61 44 50 52 54 53 53 64 67
    58 62 59 62 61 63 63 64 66 69 44 52 48 58 46 54 50 61 59 70 57
    64 58 69 53 66
    ;
    proc glm;class a;model y=x a/solution;
    lsmeans a/stderr pdiff;run;
    

    image-20200715174445521

    image-20200715174512111

    x对应的Pr>F概率小于0.05,拒绝原假设H0:x对y没有影响,说明x差异显著,所以我们要把x差异性抹掉。

    image-20200715174737275

    施用三种肥料的产量矫正后有极显著的差异(有影响)。

    8.2双因素协方差分析

    8.2.1不考虑交互作用

    image-20200715175212450
    data ex;do a=1 to 3 ;do b=1 to 5 ;
    input x y @ @;output; end; end;
    cards;
    8 2.85 10 4.24 12 3.00 11 4.94 10 2.88
    10 3.14 12 4.50 7 2.75 12 5.84 10 4.06
    12 3.88 10 3.86 9 2.82 10 4.94 9 2.89
    ;
    proc glm;class a b ;model y=x a b/solution;
    lsmeans a b/stderr pdiff;run;
    
    image-20200715175244959

    x对应的Pr>F概率小于0.05,差异性显著,所以要抹除x的影响。
    a对应的Pr>F概率大于0.05,说明不同的小区对产量没有影响。

    image-20200715175611804

    各小区的产量矫正后没有显著的差异,各品种的产量矫正后有极显著的差异。

    8.2.2考虑交互作用

    image-20200715175724633
    data ex; do a=1 to 4; do b=1 to 2;
    do i=1 to 2;input x y@@;output;end;end;end;
    cards;
    14.6 97.8 12.1 94.2 19.5 113.2 18.8
    110.1 13.6 100.3 12.9 98.5 18.5 119.4
    18.2 114.7 12.8 99.2 10.7 89.618.2
    122.2 16.9 105.3 12.0 102.1 12.4 103.8
    16.4 117.2 17.2 117.9
    proc glm; class a b;model y=x a b
    a*b/solution;lsmeans a b/stderr pdiff;
    run;
    
    image-20200715175830047 image-20200715175844475

    A与B的交互作用矫正后不显著,促生长剂之间的差异极显著,试验批次间的差异不显著

    作业

    期货交易数据主要来源于某商品交易所,包括某水果期货上市以来的换手率、涨跌幅度、保证金、交易手续费、当日平仓手续费等,其它数据如灾害性天气状况等来源于网络资料。

    换手率是期货表现热度的晴雨表,一般来讲,换手率越高,表明该产品越受到消费者青睐。请你查阅相关文献,研究本数据表,通过建立数学模型或统计分析方法,回答下列问题。

    1. 研究换手率的变化规律。

    2. 研究哪些因素对换手率是有影响的,哪些是没有影响的。

    3. 保证金、手续费、当日平仓、是否有灾害天气、是否消费旺季这几个影响因素之间是否有关联?

    数据下载地址:

    https://pluto-1300780100.cos.ap-nanjing.myqcloud.com/download/%E7%AC%AC9%E6%AC%A1%E4%BD%9C%E4%B8%9A%E6%95%B0%E6%8D%AE.xlsx

    1.第一问

    研究数据的变化规律我们主要从数据的周期、数据的趋势、数据的随机性、以及数据内部的传递性四个方面来研究

    编写SAS代码:

    data a;
    input x@@;
    time=_n_;
    cards;
    1.9393939 
    1.5531915 
    0.4479495 
    0.1027190 
    0.1460055 
    0.0303030 
    0.0027624 
    0.0217984 
    0.0189189 
    0.1195652 
    0.0803109 
    0.0401003 
    0.0148883 
    0.1724138 
    0.0722101 
    0.4933862 
    0.3757030 
    0.6139410 
    0.2022090 
    0.5193165 
    0.1047904 
    0.4113009 
    0.2120098 
    0.6241173 
    0.4927114 
    0.5597057 
    0.5261997 
    0.4409524 
    0.9422921 
    0.4413395 
    0.6832524 
    0.3633678 
    0.3216830 
    0.3055872 
    0.3648144 
    0.3870395 
    0.2108352 
    0.1683833 
    0.2786482 
    0.1587838 
    0.1848568 
    0.3312333 
    0.5001322 
    0.3252688 
    0.4822900 
    0.3515249 
    0.4836197 
    0.3796296 
    0.2374334 
    0.2439367 
    0.1602456 
    0.2312500 
    0.8488216 
    0.8472093 
    1.0440485 
    0.9208815 
    0.9387877 
    1.1929144 
    1.7572786 
    0.9151355 
    1.2559558 
    1.1759934 
    1.7465747 
    2.4862373 
    2.4405618 
    3.4839917 
    5.7556963 
    3.3591598 
    3.3471258 
    6.5572674 
    3.8542786 
    4.4468939 
    4.4002278 
    4.6747778 
    4.2003163 
    5.2316854 
    6.1956928 
    9.2880570 
    5.2759323 
    5.6891960 
    3.5593666 
    1.9292312 
    2.6713994 
    1.8885801 
    1.8040694 
    1.7526615 
    2.0106814 
    1.6252591 
    1.8017329 
    1.4488495 
    1.2168779 
    2.0032830 
    1.1555587 
    1.0751166 
    2.2721227 
    1.6036624 
    2.0975010 
    1.9572098 
    1.6813667 
    1.5758161 
    1.9966546 
    2.4764227 
    2.8488007 
    2.6637306 
    2.8162721 
    2.6001077 
    1.5894797 
    2.1950105 
    1.6263468 
    1.8976734 
    1.6096398 
    1.5009201 
    1.5783214 
    1.3981174 
    1.1690259 
    0.9194704 
    1.0540232 
    1.1763860 
    1.5252878 
    1.1742093 
    3.8136751 
    2.0073488 
    2.7448852 
    1.7984086 
    1.9759923 
    1.5409623 
    2.3586512 
    1.4594724 
    1.3989078 
    1.2159621 
    1.4583811 
    1.5540499 
    1.4569306 
    1.7132759 
    1.8280245 
    2.4647509 
    2.1774181 
    2.0933134 
    1.4973353 
    1.2432843 
    1.5350945 
    1.3863774 
    1.5953973 
    1.8658197 
    2.7395673 
    1.8784120 
    1.7965255 
    2.8155407 
    2.3215706 
    1.8111513 
    1.6633678 
    1.5670568 
    1.9503250 
    1.6817802 
    1.6820488 
    2.3459841 
    1.7021874 
    1.6720504 
    1.5629485 
    1.1998658 
    1.1092371 
    1.5260981 
    1.3209728 
    1.2159580 
    1.2582135 
    1.0660533 
    2.2136745 
    1.0290641 
    1.1133371 
    2.0062529 
    1.1895146 
    2.0715051 
    1.7548775 
    1.0554558 
    1.1839372 
    1.3777651 
    1.0361367 
    2.0423229 
    2.0586479 
    2.3740129 
    1.6712147 
    1.7715363 
    2.3964418 
    1.3733103 
    1.3112867 
    1.3697364 
    1.1895383 
    2.5241314 
    1.2212908 
    1.6053514 
    0.9989995 
    1.2968232 
    1.3770413 
    0.9131243 
    1.4921420 
    0.9540247 
    1.0605178 
    0.7622555 
    0.8025549 
    1.0871273 
    0.8945853 
    0.7594745 
    1.3254880 
    0.5804381 
    0.4918341 
    0.6856156 
    0.7278238 
    0.3679483 
    0.7141156 
    0.6593457 
    0.8554738 
    0.9600813 
    0.5534354 
    0.6820879 
    0.5855344 
    0.3507366 
    0.3299955 
    0.4699115 
    0.2322538 
    0.2629292 
    0.1586035 
    0.4082599 
    0.4575238 
    0.2716628 
    0.1468593 
    0.6918954 
    0.3657791 
    0.4294517 
    0.2246681 
    0.4752675 
    0.2789720 
    0.7303103 
    8.6850394 
    1.1205674 
    0.3065134 
    0.3596491 
    0.2870370 
    0.0970874 
    0.0920245 
    0.1953125 
    0.2035398 
    0.3000000 
    ;
    proc gplot;
    plot x*time;
    symbol c=black i=join v=star;
    proc arima;
    identify var=x;
    run;
    

    得到时序图:

    image-20200715150428236

    从图中我们可以看出数据大致可以判断为是不具有周期性波动的,且数据波动性较大,故初步判断该数据不是平稳的。然而由于根据时序图的判断严谨性不高,于是根据自相关图进行进一步的判断。

    image-20200715150611312

    随着时间平移长度的增大,自相关系数的数值的变化并未呈周期性变化。从图片右半边的表示自相关系数的图也可以看出:自相关系数并不是是呈周期性波动。综合时序图的分析以及自相关图的分析,得到以下结论:该数据并不具有周期性且不平稳。

    由于原始数据不具有平稳性我们需要对原始数据进行差分运算,故对原始数据进行一阶差分运算并且需要对运算后得出的数据进行平稳性检验,检验结果如下。

    image-20200715155227846

    将数据一阶差分后按照月份做出来的时序图,从图中我们可以看出运算后数据大致可以判断为是在一条水平线上下波动,故初步判断该序列是平稳的。然而由于根据时序图的判断严谨性不高,于是根据自相关图进行进一步的判断。

    image-20200715155251970

    在时间平移长度较小时,自相关系数的数值较大,当时间平移长度扩大时,自相关系数的数值总体来说是在逐渐趋近于0,由此可以得出自相关系数具有拖尾性。从图片右半边的表示自相关系数的图也可以看出:自相关系数在0.0 这条线的左右波动。综合时序图的分析以及自相关图的分析,得到以下结论:该数据具有平稳性。由于通过一阶差分使得数据平稳,故该数据中具有线性趋势。

    已知该序列在进行差分运算后是平稳的,要选择选择适当模型拟合该序列的发展还需要证明该序列在差分运算后是非白噪声的。白噪声检
    验结果如下。

    image-20200715155341570

    延迟6 期、延迟12 期、延迟18 期、延迟24 期的p值分别为<.0001、<.0001、<.0001、0.0005,都远小于0.05,故拒绝原假设,数据之间存在相关性,该数据在差分运算后是非白噪声的,故该数据不具有随机波动。

    综合以上分析,得出以下结论:换手率的变化不具有周期性,具有线性趋势,数据内部具有相关性,不具有随机波动。

    2.第二问

    第二问要求对换手率有影响的因素,要研究的是变量和多个分类变量之间的关系,因此选择应用多组独立样本的H检验法进行研究。

    SAS代码:

    data ex;
    input x a b c d e@@;
    cards;
    1.9393939 	0.07	0.5	0	0	0
    1.5531915 	0.07	0.5	0	0	0
    0.4479495 	0.07	0.5	0	0	0
    0.1027190 	0.07	0.5	0	0	0
    0.1460055 	0.07	0.5	0	0	0
    0.0303030 	0.07	0.5	0	0	0
    0.0027624 	0.07	0.5	0	0	0
    0.0217984 	0.07	0.5	0	0	0
    0.0189189 	0.07	0.5	0	0	0
    0.1195652 	0.07	0.5	0	0	0
    0.0803109 	0.07	0.5	0	0	0
    0.0401003 	0.07	0.5	0	0	0
    0.0148883 	0.07	0.5	0	0	1
    0.1724138 	0.07	0.5	0	0	1
    0.0722101 	0.07	0.5	0	0	1
    0.4933862 	0.07	0.5	0	0	1
    0.3757030 	0.07	0.5	0	0	1
    0.6139410 	0.07	0.5	0	0	1
    0.2022090 	0.07	0.5	0	0	1
    0.5193165 	0.07	0.5	0	0	1
    0.1047904 	0.07	0.5	0	0	1
    0.4113009 	0.07	0.5	0	0	1
    0.2120098 	0.07	0.5	0	0	1
    0.6241173 	0.07	0.5	0	0	1
    0.4927114 	0.07	0.5	0	0	1
    0.5597057 	0.07	0.5	0	0	1
    0.5261997 	0.07	0.5	0	0	1
    0.4409524 	0.07	0.5	0	0	0
    0.9422921 	0.07	0.5	0	0	0
    0.4413395 	0.07	0.5	0	1	0
    0.6832524 	0.07	0.5	0	0	0
    0.3633678 	0.07	0.5	0	0	0
    0.3216830 	0.07	0.5	0	0	0
    0.3055872 	0.07	0.5	0	0	0
    0.3648144 	0.07	0.5	0	0	0
    0.3870395 	0.07	0.5	0	0	0
    0.2108352 	0.07	0.5	0	0	0
    0.1683833 	0.07	0.5	1	0	0
    0.2786482 	0.07	0.5	1	0	0
    0.1587838 	0.07	0.5	1	0	0
    0.1848568 	0.07	0.5	1	0	0
    0.3312333 	0.07	0.5	1	0	0
    0.5001322 	0.07	0.5	1	0	0
    0.3252688 	0.07	0.5	1	0	0
    0.4822900 	0.07	0.5	1	0	0
    0.3515249 	0.07	0.5	1	0	0
    0.4836197 	0.07	0.5	1	0	0
    0.3796296 	0.07	0.5	1	0	0
    0.2374334 	0.07	0.5	1	0	0
    0.2439367 	0.07	0.5	1	0	0
    0.1602456 	0.07	0.5	1	0	0
    0.2312500 	0.07	0.5	1	0	0
    0.8488216 	0.07	0.5	1	1	0
    0.8472093 	0.07	0.5	1	0	0
    1.0440485 	0.07	0.5	1	0	0
    0.9208815 	0.07	0.5	1	0	0
    0.9387877 	0.07	0.5	1	0	0
    1.1929144 	0.07	0.5	1	0	0
    1.7572786 	0.07	0.5	1	0	0
    0.9151355 	0.07	0.5	1	0	0
    1.2559558 	0.07	0.5	1	0	0
    1.1759934 	0.07	0.5	1	0	0
    1.7465747 	0.07	0.5	1	0	0
    2.4862373 	0.07	0.5	1	0	0
    2.4405618 	0.07	0.5	1	0	0
    3.4839917 	0.07	0.5	1	0	0
    5.7556963 	0.07	0.5	1	0	0
    3.3591598 	0.07	0.5	1	0	0
    3.3471258 	0.07	0.5	1	0	0
    6.5572674 	0.07	0.5	1	0	0
    3.8542786 	0.07	0.5	1	0	0
    4.4468939 	0.07	0.5	1	0	0
    4.4002278 	0.07	0.5	1	0	0
    4.6747778 	0.07	0.5	1	0	0
    4.2003163 	0.07	0.5	1	0	0
    5.2316854 	0.07	0.5	1	0	0
    6.1956928 	0.07	0.5	1	1	0
    9.2880570 	0.07	0.5	1	0	0
    5.2759323 	0.07	0.5	3	0	0
    5.6891960 	0.07	0.5	3	0	0
    3.5593666 	0.07	0.5	3	0	0
    1.9292312 	0.07	0.5	20	0	0
    2.6713994 	0.07	0.5	20	0	0
    1.8885801 	0.07	0.5	20	0	0
    1.8040694 	0.07	0.5	20	0	0
    1.7526615 	0.07	0.5	20	0	0
    2.0106814 	0.07	0.5	20	1	0
    1.6252591 	0.07	0.5	20	0	0
    1.8017329 	0.07	0.5	20	0	0
    1.4488495 	0.07	0.5	20	0	0
    1.2168779 	0.07	0.5	20	0	0
    2.0032830 	0.07	0.5	20	0	0
    1.1555587 	0.07	0.5	20	0	0
    1.0751166 	0.07	0.5	20	0	0
    2.2721227 	0.07	0.5	20	0	0
    1.6036624 	0.07	0.5	20	0	0
    2.0975010 	0.07	0.5	20	0	0
    1.9572098 	0.07	0.5	20	1	0
    1.6813667 	0.09	10	20	0	0
    1.5758161 	0.09	10	20	0	0
    1.9966546 	0.09	10	20	0	0
    2.4764227 	0.09	10	20	0	0
    2.8488007 	0.09	20	20	0	0
    2.6637306 	0.09	20	20	0	0
    2.8162721 	0.09	20	20	0	0
    2.6001077 	0.09	20	20	0	0
    1.5894797 	0.09	20	20	0	0
    2.1950105 	0.11	20	20	1	0
    1.6263468 	0.11	20	20	0	0
    1.8976734 	0.11	20	20	0	0
    1.6096398 	0.11	20	20	0	0
    1.5009201 	0.11	20	20	0	0
    1.5783214 	0.11	20	20	0	0
    1.3981174 	0.11	20	20	0	0
    1.1690259 	0.11	20	20	0	0
    0.9194704 	0.11	20	20	0	0
    1.0540232 	0.11	20	20	0	0
    1.1763860 	0.11	20	20	0	0
    1.5252878 	0.11	20	20	0	0
    1.1742093 	0.11	20	20	0	0
    3.8136751 	0.11	20	20	0	0
    2.0073488 	0.11	20	20	0	0
    2.7448852 	0.11	20	20	0	0
    1.7984086 	0.11	20	20	0	0
    1.9759923 	0.11	20	20	0	0
    1.5409623 	0.11	20	20	0	0
    2.3586512 	0.11	20	20	0	0
    1.4594724 	0.11	20	20	0	0
    1.3989078 	0.11	20	20	0	0
    1.2159621 	0.11	20	20	0	0
    1.4583811 	0.11	20	20	0	0
    1.5540499 	0.11	20	20	0	0
    1.4569306 	0.11	20	20	0	0
    1.7132759 	0.11	20	20	0	0
    1.8280245 	0.11	20	20	0	0
    2.4647509 	0.11	20	20	0	0
    2.1774181 	0.11	20	20	0	0
    2.0933134 	0.11	20	20	0	0
    1.4973353 	0.11	20	20	0	0
    1.2432843 	0.11	20	20	0	0
    1.5350945 	0.11	20	20	0	0
    1.3863774 	0.11	20	20	0	0
    1.5953973 	0.11	20	20	0	0
    1.8658197 	0.11	20	20	0	0
    2.7395673 	0.11	20	20	0	0
    1.8784120 	0.11	20	20	0	0
    1.7965255 	0.11	20	20	0	0
    2.8155407 	0.11	20	20	0	0
    2.3215706 	0.11	20	20	0	0
    1.8111513 	0.11	20	20	0	0
    1.6633678 	0.11	20	20	0	0
    1.5670568 	0.11	20	20	0	0
    1.9503250 	0.11	20	20	0	0
    1.6817802 	0.11	20	20	0	0
    1.6820488 	0.11	20	20	0	0
    2.3459841 	0.11	20	20	0	0
    1.7021874 	0.11	20	20	0	0
    1.6720504 	0.11	20	20	0	0
    1.5629485 	0.11	20	20	0	0
    1.1998658 	0.11	20	20	0	0
    1.1092371 	0.11	20	20	0	0
    1.5260981 	0.11	20	20	0	0
    1.3209728 	0.11	20	20	0	0
    1.2159580 	0.11	20	20	0	0
    1.2582135 	0.11	20	20	0	0
    1.0660533 	0.11	20	20	0	0
    2.2136745 	0.11	20	20	0	0
    1.0290641 	0.11	20	20	0	0
    1.1133371 	0.11	20	20	0	0
    2.0062529 	0.11	20	20	0	0
    1.1895146 	0.11	20	20	0	0
    2.0715051 	0.11	20	20	0	0
    1.7548775 	0.11	20	20	0	0
    1.0554558 	0.11	20	20	0	1
    1.1839372 	0.11	20	20	0	1
    1.3777651 	0.11	20	20	0	1
    1.0361367 	0.11	20	20	0	1
    2.0423229 	0.11	20	20	0	1
    2.0586479 	0.11	20	20	0	1
    2.3740129 	0.11	20	20	0	1
    1.6712147 	0.11	20	20	0	1
    1.7715363 	0.11	20	20	0	1
    2.3964418 	0.11	20	20	0	1
    1.3733103 	0.11	20	20	0	1
    1.3112867 	0.11	20	20	0	1
    1.3697364 	0.11	20	20	0	1
    1.1895383 	0.11	20	20	0	1
    2.5241314 	0.11	20	20	0	1
    1.2212908 	0.11	20	20	0	1
    1.6053514 	0.11	20	20	0	1
    0.9989995 	0.11	20	20	0	1
    1.2968232 	0.11	20	20	0	1
    1.3770413 	0.11	20	20	0	1
    0.9131243 	0.11	20	20	0	1
    1.4921420 	0.11	20	20	0	1
    0.9540247 	0.11	20	20	0	1
    1.0605178 	0.11	20	20	0	1
    0.7622555 	0.11	20	20	0	1
    0.8025549 	0.11	20	20	0	1
    1.0871273 	0.11	20	20	0	1
    0.8945853 	0.11	20	20	0	1
    0.7594745 	0.11	20	20	0	1
    1.3254880 	0.15	20	20	0	1
    0.5804381 	0.15	20	20	0	1
    0.4918341 	0.15	20	20	0	1
    0.6856156 	0.15	20	20	0	1
    0.7278238 	0.15	20	20	0	1
    0.3679483 	0.15	20	20	0	1
    0.7141156 	0.15	20	20	0	1
    0.6593457 	0.15	20	20	0	1
    0.8554738 	0.15	20	20	0	1
    0.9600813 	0.15	20	20	0	1
    0.5534354 	0.15	20	20	0	1
    0.6820879 	0.2	20	20	0	0
    0.5855344 	0.2	20	20	0	0
    0.3507366 	0.2	20	20	0	0
    0.3299955 	0.2	20	20	0	0
    0.4699115 	0.2	20	20	0	0
    0.2322538 	0.2	20	20	0	0
    0.2629292 	0.2	20	20	0	0
    0.1586035 	0.2	20	20	0	0
    0.4082599 	0.2	20	20	0	0
    0.4575238 	0.2	20	20	0	0
    0.2716628 	0.2	20	20	0	0
    0.1468593 	0.2	20	20	0	0
    0.6918954 	0.2	20	20	0	0
    0.3657791 	0.2	20	20	0	0
    0.4294517 	0.2	20	20	0	0
    0.2246681 	0.2	20	20	0	0
    0.4752675 	0.2	20	20	0	0
    0.2789720 	0.2	20	20	0	0
    0.7303103 	0.2	20	20	0	0
    8.6850394 	0.2	20	20	0	0
    1.1205674 	0.2	20	20	0	0
    0.3065134 	0.2	20	20	0	0
    0.3596491 	0.2	20	20	0	0
    0.2870370 	0.2	20	20	0	0
    0.0970874 	0.2	20	20	0	0
    0.0920245 	0.2	20	20	0	0
    0.1953125 	0.2	20	20	0	0
    0.2035398 	0.2	20	20	0	0
    0.3000000 	0.2	20	20	0	0
    ;
    proc npar1way wilcoxon;class a;var x;
    proc npar1way wilcoxon;class b;var x;
    proc npar1way wilcoxon;class c;var x;
    proc npar1way wilcoxon;class d;var x;
    proc npar1way wilcoxon;class e;var x;
    run;
    

    最后得到如下结果:(按abcde排序)

    image-20200715153010791image-20200715153022633image-20200715153030832image-20200715153042717image-20200715153048345

    可以做成如下表格:

    保证金因素手续费因素当日平仓因素是否有灾害天气因素是否消费旺季因素
    Chi-Square65.68847.943729.39562.16236.6572
    DF42211
    Pr > Chi-Square<.00010.0188<.00010.14140.0099

    可以看出保证金因素、手续费因素、当日平仓因素、是否消费旺季因素这四个因素的P值均小于0.05,落在拒绝域中,拒绝原假设,认为样本分布与换手率的样本分布不同,因此认为以上四个因素对换手率没有显著的影响;而是否有灾害天气因素的P值为0.1414大于0.05,接受原假设,认为认为样本分布与换手率的样本分布相同,因此认为是否有灾害天气因素对换手率有显著的影响。

    3.第三问

    第三问要求的是多个分类变量之间的关系,因此选用独立性检验来研究变量之间的关系。

    SAS代码:

    data ex;
    input x a b c d e@@;
    cards;
    /*与上面数据相同*/
    ;
    proc freq;
    tables a*b/chisq;
    tables a*c/chisq;
    tables a*d/chisq;
    tables a*e/chisq;
    tables b*c/chisq;
    tables b*d/chisq;
    tables b*e/chisq;
    tables c*d/chisq;
    tables c*e/chisq;
    tables d*e/chisq;
    run;
    

    image-20200715154414939

    得到很多表,综合下来我们做出一张表:

    image-20200715154840320

    保证金和手续费之间自由度为8,χ2 (Chi-Square value)=345.7143,且Prob值<0.0001<0.05,故落在拒绝域,接受备择假设,即保证金和手续费这两因素之间不是相互独立的,即保证金对手续费是有关系的,同理可知,保证金和当日平仓,保证金和是否消费旺季,手续费和当日平仓,手续费和是否消费旺季,当日平仓和是否消费旺季这些因素的Prob值均小于0.05,故落在拒绝域,接受备择假设,所以认为这些因素之间不是相互独立的,即保证金和对当日平仓,保证金对是否消费旺季,手续费对当日平仓,手续费对是否消费旺季都是有关系的,相反可以知道,保证金和是否有灾害天气,手续费和是否有灾害天气,当日平仓和是否有灾害天气,是否有灾害天气和是否消费旺季这些因素的Prob值均大于0.05,故落在接受域,接受原假设,所以认为这些因素之间是相互独立的,即保证金对是否有灾害天气,手续费对是否有灾害天气,当日平仓对是否有灾害天气,是否有灾害天气对是否消费旺季是没有影响的。

    结语

    溃疡好了,👴没理由再偷懒了,555555555

    展开全文
  • 一、MySQL性能优化之-影响性能的因素1.商业需求的影响不合理需求造成资源投入产出比过低,这里我们就用一个看上去很简单的功能来分析一下。需求:一个论坛帖子总量的统计,附加要求:实时更新从功能上来看非常容易...

    一、MySQL性能优化之-影响性能的因素


    1.商业需求的影响

    不合理需求造成资源投入产出比过低,这里我们就用一个看上去很简单的功能来分析一下。

    需求:一个论坛帖子总量的统计,附加要求:实时更新

    从功能上来看非常容易实现,执行一条SELECT COUNT(*) from 表名的Query 就可以得到结果。但是,如果我们采用不是MyISAM 存储引擎,而是使用的Innodb 的存储引擎,那么大家可以试想一下,如果存放帖子的表中已经有上千万的帖子的时候,执行这条Query 语句需要多少成本?恐怕再好的硬件设备,都不可能在10秒之内完成一次查询吧

    注:没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。

    既然这样查询不行,那我们是不是该专门为这个功能建一个表,就只有一个字段,一条记录,就存放这个统计量,每次有新的帖子产生的时候,都将这个值增加1,这样我们每次都只需要查询这个表就可以得到结果了,这个效率肯定能够满足要求了。确实,查询效率肯定能够满足要求,可是如果帖子产生很快,在高峰时期可能每秒就有几十甚至上百个帖子新增操作的时候,恐怕这个统计表又要成为大家的噩梦了。要么因为并发的问题造成统计结果的不准确,要么因为锁资源争用严重造成整体性能的大幅度下降。

    其实这里问题的焦点不应该是实现这个功能的技术细节,而是在于这个功能的附加要求“实时更新”上面。当一个论坛的帖子数量很大了之后,到底有多少人会关注这个统计数据是否是实时变化的?有多少人在乎这个数据在短时间内的不精确性?恐怕不会有人会盯着这个统计数字并追究当自己发了一个帖子然后回头刷新页面发现这个统计数字没有加1 吧?所以只要去掉了这个“实时更新”的附加条件,就可以非常容易的实现这个功能了。就像之前所提到的那样,通过创建一个统计表,然后通过一个定时任务每隔一定时间段去更新一次里面的统计值,这样既可以解决统计值查询的效率问题,又可以保证不影响新发贴的效率,一举两得。

    2.系统架构及实现的影响

    所有数据都是适合在数据库中存放的吗?数据库为我们提供了太多的功能,反而让很多并不是太了解数据库的人错误的使用了数据库的很多并不是太擅长或者对性能影响很大的功能,最后却全部怪罪到数据库身上。

    实际上,以下几类数据都是不适合在数据库中存放的:

    (1.) 二进制多媒体数据

    这种数据主要包括图片,音频、视频和其他一些相关的二进制文件。将二进制多媒体数据存放在数据库中,一个问题是数据库空间资源耗用非常严重,另一个问题是这些数据的存储很消耗数据库主机的CPU 资源。这些数据的处理本不是数据库的优势,如果我们硬要将他们塞入数据库,肯定会造成数据库的处理资源消耗严重。

    (2.)超大文本数据

    对于5.0.3 之前的MySQL 版本,VARCHAR 类型的数据最长只能存放255 个字节,如果需要存储更长的文本数据到一个字段,我们就必须使用TEXT 类型(最大可存放64KB)的字段,甚至是更大的LONGTEXT 类型(最大4GB)。而TEXT类型数据的处理性能要远比VARCHAR 类型数据的处理性能低下很多。从5.0.3 版本开始,VARCHAR 类型的最大长度被调整到64KB 了,所以,超大文本数据存放在数据库中不仅会带来性能低下的问题,还会带来空间占用的浪费问题。

    是否合理的利用了应用层Cache 机制?

    对于Web 应用,活跃数据的数据量总是不会特别的大,有些活跃数据更是很少变化。对于这类数据,我们是否有必要每次需要的时候都到数据库中去查询呢?如果我们能够将变化相对较少的部分活跃数据通过应用层的Cache 机制Cache 到内存中,对性能的提升肯定是成数量级的,而且由于是活跃数据,对系统整体的性能影响也会很大。

    3.查询语句对性能的影响

    SQL语句的优劣是对性能有影响的,每个SQL 语句在优化之前和优化之后的性能差异也是各不相同。

    在数据库管理软件中,最大的性能瓶颈就是在于磁盘IO,也就是数据的存取操作上面。而对于同一份数据,当我们以不同方式去寻找其中的某一点内容的时候,所需要读取的数据量可能会有天壤之别,所消耗的资源也自然是区别很大。

    功能完全相同的两条SQL 的在性能方面的差异。

    我们在执行sql语句时可以用explain来查看执行计划:

    还可以打开mysql的profiling 功能,来查看sql的实际执行计划

    通过执行“SHOW PROFILE”命令获取当前系统中保存的多个Query 的profile 的概要信息。;

    4.数据库Schema设计对性能的影响

    5.硬件选择对性能的影响

    首先,数据库主机是存取数据的地方,所以数据库主机的IO 性能肯定是需要最优先考虑的一个因素,这一点不管是什么类型的数据库应用都是适用的。在主机中决定IO 性能部件主要由磁盘和内存所决定,当然也包括各种与IO 相关的板卡。

    其次,由于数据库主机和普通的应用程序服务器相比,资源要相对集中很多,单台主机上所需要进行的计算量自然也就比较多,所以数据库主机的CPU处理能力也不能忽视。

    最后,由于数据库负责数据的存储,与各应用程序的交互中传递的数据量比其他各类服务器都要多,所以数据库主机的网络设备的性能也可能会成为系统的瓶颈。

    所以,数据库应用系统的优化,实际上是一个需要多方面配合,多方面优化的才能产生根本性改善的事情。简单来说,可以通过下面三句话来简单的概括数据库应用系统的性能优化:商业需求合理化,系统架构最优化,逻辑实现精简化,硬件设施理性化。


    二、MySQL性能优化之-索引


    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。

    做一个简单测试,假如我们创建了一个tb1表,向表中插入20000行数据,表的创建和数据插入用如下脚本实现

    [root@mysql ~]# cat mysql.sh
    #!/bin/bash
    HOSTNAME="localhost"
    PORT="3306"
    USERNAME="root"
    PASSWORD="pwd123"
    
    DBNAME="tables"
    TABLENAME="tb1"
    
    #create database
    mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} -e "drop database if exists ${DBNAME}"
    create_db_sql="create database if not exists ${DBNAME}"
    mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} -e "${create_db_sql}"
    
    #create table
    create_table_sql="create table if not exists ${TABLENAME}(stuid int not null primary key,stuname varchar(20) not null,stusex char(1) not null,cardid varchar(20) not null,birthday datetime,entertime datetime,address varchar(100) default null)"
    mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${create_table_sql}"
    
    #insert data to table
    i=1
    while [ $i -le 20000 ]
    do 
    insert_sql="insert into ${TABLENAME} values ($i,'zhangsan','1','1234567890123456','1999-10-10','2016-9-3','zhongguo beijingshi changpinqu')"
    mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${insert_sql}"
    let i++
    done
    #select data
    select_sql="select count(*) from ${TABLENAME}"
    mysql -h ${HOSTNAME} -P ${PORT} -u ${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}"

    再手动插入一行数据,如

    下面开始测试,查询stuname=’admin’的记录

    情况1:stuname列上没有创建索引的情况

    情况2:stuname列上创建索引的情况再查询

    mysql> create index index_stuname on tb1(stuname);

    在查找stuname="admin"的记录时,如果在stuname上已经建立了索引,MySQL无须任何扫描全表,即准确可找到该记录。相反,MySQL会扫描所有记录。

    所以在数据库表中,对字段建立索引可以大大提高查询速度。

    索引是在存储引擎中实现的,而不是在服务器层中实现的。所以,每种存储引擎的索引都不一定完全相同,并不是所有的存储引擎都支持所有的索引类型。


    索引概述: 


    什么是索引? 

    索引(Index)是帮助MySQL高效获取数据的数据结构,这是一种比较官方的说法。它的存在形式是文件。索引能够帮助我们快速定位数据。 更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

    索引的数据结构

    这里主介绍B-tree索引的结构


    如上图,是一颗b+树,这里只说一些重点,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项和指针,如17、35并不真实存在于数据表中。

    b+树的查找过程

    如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

    为什么使用索引? 

    索引可以让mysql高效运行,可以大大提高mysql的查询(包括排序,分组)效率;数据约束(唯一索引的建立)。

    索引给我带来什么好处? 

    提高查询效率,快速定位数据 

    使用索引产生的代价? 

    1、索引本身是以文件的形式存放在硬盘,需要的时候才加载至内存,所以添加索引会增加磁盘的开销; 

    2、写数据:需要更新索引,对数据库是个很大的开销,降低表更新、添加和删除的速度 

    不建议使用索引的情况: 

    (a) 表记录较少 

    (b) 索引的选择性较低,所谓索引的选择性,是指不重复的索引值与表记录数的比值,取值范围(0-1)。选择性越高,索引的价值越大。 

    索引的类型? 

    索引包括单列索引和组合索引

    单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。 

    1、 普通索引 

    这是最基本的索引,它没有任何限制

    CREATE INDEX indexName ON tablename(column1[,column2,……])

    2、 唯一索引 

    它与前面的普通索引类似,不同的就是索引列的值必须唯一,但允许空值,空值是指null。如果是组合索引,组合列的值必须唯一 。

    CREATE UNIQUE INDEX indexName ON tablename(column1[,column2,……])

    主键索引:一种特殊的唯一索引,不允许有空值,一般在建表的时候同时建立主键索引 

    CREATE TABLE tablename(ID INT NOTNULL,  username VARCHAR(16) NOT NULL,  PRIMARY KEY(ID) );

    3、组合索引

    为了进一步提升MySQL的效率,就要考虑建立组合索引

    例如:创建一个表,包含如下字段

    CREATE TABLE mytable(ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL  ); 

    将username, city, age建到一个索引里

    CREATE INDEX username_city_age ON mytable(username,city,age);

    如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于组合索引。虽然此时有了三个索引,但MySQL只能用到其中那个它认为似乎是最有效率的单列索引。

    建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:

    usernname,city,age  usernname,city   usernname  为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:

    SELECT * FROM mytable WHREE username="admin" AND city="郑州"  
    SELECT * FROM mytable WHREE username="admin"
    

    而下面几个则不会用到:

    SELECT * FROM mytable WHREE age=20 AND city="郑州"  
    SELECT * FROM mytable WHREE city="郑州"
    

    如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能对索引最左边的前缀进行有效的查找。

    例如:
    假设存在组合索引index1(c1,c2),查询语句select * from t1 where c1=1 and c2=2能够使用该索引。查询语句select *from t1 where c1=1也能够使用该索引。但是,查询语句select * from t1 where c2=2不能够使用该索引,因为没有组合索引的引导列,即要想使用c2列进行查找,必需出现c1等于某值。因此我们在创建组合索引时应该将最常用作限制条件的列放在最左边,依次递减。

    4、 全文索引 

    只用于MyISAM 表 对文本域进行索引。字段类型包括char、varchar、text

    不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。

    CREATE FULLTEXT INDEX indexname ON tablename(column)

    查看索引

    mysql> show index from tablename;
    mysql> show keys from tablename;
    

    建立索引的时机

    到这里我们已经学会了建立索引,那么我们需要在什么情况下建立索引呢?

    一般来说,WHEREJOIN子句中出现的列需要建立索引,例如:在username上创建索引

    SELECT * FROM mytable WHREE username="admin" AND city="郑州"

    代码如下:

    SELECT t.Name  FROM mytable1 t LEFTJOIN mytable2 m   ON t.username=m.username;

    此时就需要对两个表的userame上建立索引。

    使用索引的注意事项

    刚才提到只有某些时候的LIKE才需建立索引。因为在以通配符%和_开头作查询时,MySQL不会使用索引。例如下句会使用索引:

    SELECT * FROM mytable WHERE username like'admin%'

    而下句就不会使用:

    SELECT * FROM mytable WHEREt Name like'%admin'
    

    不要在列上进行运算,例如

    select * from users where YEAR(adddate)<2007;

    将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成

    select * from users where adddate<‘2007-01-01';

    总结:

    选择索引列: 

    a.性能优化过程中,选择在哪个列上创建索引是最重要的步骤之一。可以考虑使用索引     的主要有 两种类型的列:在where子句中出现的列,在join子句中出现的列。 
    b.考虑列中值的分布,索引的列的基数越大,索引的效果越好。 
    c.使用短索引,如果对字符串列进行索引,应该指定一个前缀长度,可节省大量索引空间,提升查询速度。 

    例如:CREATEINDEX username_city_age ON mytable(username(10),city,age);

    建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

    d.利用最左前缀 
    e.不要过度索引,只保持所需的索引。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。 在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长。 
    MySQL只对以下操作符才使用索引:<,<=,=,>,>=,between,in, 
    以及某些时候的like(不以通配符%或_开头的情形)。

    以下就是有关Mysql索引的相关理论介绍,下面我们来学习如何慢查询分析、优化索引和配置

     三、mysql性能优化-慢查询分析、优化索引和配置


    基本思路:

    (1)性能瓶颈定位

    Show命令

    慢查询日志

    explain分析查询

    profiling分析查询

    (2)索引及查询优化

    (3)配置优化

    MySQL数据库最常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在网络上,那么查询量相当大的时候那么平瓶颈就会出现在网络上,我们可以用mpstat, iostat, sar和vmstat来查看系统的性能状态。

    除了服务器硬件的性能瓶颈,对于MySQL系统本身,我们可以使用工具来优化数据库的性能,通常有三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。

    1、查询与索引优化分析

    在优化MySQL时,通常需要对数据库进行分析,常见的分析手段有慢查询日志,EXPLAIN 分析查询,profiling分析以及show命令查询系统状态及系统变量,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。

    性能瓶颈定位

    show命令

    可以通过show命令查看MySQL状态及变量,找到系统的瓶颈:

    查看MySQL服务器配置信息mysql> show variables;

    查看MySQL服务器运行的各种状态值mysql> show global status; 

    # mysqladmin variables -u username -ppassword——显示系统变量
    # mysqladmin extended-status -u username -ppassword——显示状态信息
    

    比较全的show命令的使用可参考:mysql>help show

    或http://dev.mysql.com/doc/refman/5.7/en/show.html

    慢查询日志

    慢查询日志开启:

    在配置文件my.cnf中在[mysqld]一行下面加入3个配置参数,并重启mysql服务

    slow_query_log = 1    //0关闭  1开启
    slow_query_log_file = /usr/local/mysql/data/slow-query.log    //慢查询日志存放地点

    long_query_time = 1                              //表示查询超过1秒才记录                                

    在my.cnf中添加log-queries-not-using-indexes参数,表示向慢查询日志中记录下没有使用索引的查询。

    慢查询日志开启方法二:

    我们也可以通过命令行设置变量来即时启动慢日志查询

    mysql> set global slow_query_log =on;

    mysql> set long_query_time = 0.01;

    mysql> set global slow_query_log_file= "/usr/local/mysql/data/slow-query.log";

    查看慢查询的设置信息

    mysql> show variables like '%slow_query_log%';
    mysql> show variables like '%long_query_time%';
    

    我们可以通过打开log文件查看得知哪些SQL执行效率低下

    [root@mysql data]# cat slow-query.log 
    # Time: 2016-09-06T14:17:12.582189Z
    # User@Host: root[root] @ localhost []  Id:     3
    # Query_time: 0.008316  Lock_time: 0.000304 Rows_sent: 1  Rows_examined: 20002
    SET timestamp=1473171432;
    select * from test1.tb1 where stusex='0';    //没有使用索引的query
    
    # Time: 2016-09-06T15:54:42.648291Z
    # User@Host: root[root] @ localhost []  Id:    14
    # Query_time: 0.017319  Lock_time: 0.000612 Rows_sent: 1  Rows_examined: 20001
    SET timestamp=1473177282;
    select * from test1.tb1 where entertime <> '2016-9-3';  //慢查询query
    

    select * from test1.tb1 where entertime<> '2016-9-3';  //慢查询query

    从日志中,可以发现查询时间超过0.01 秒的SQL,而小于0.01秒的没有出现在此日志中。

    如果慢查询日志中记录内容很多,可以使用mysqldumpslow工具(MySQL客户端安装自带)来对慢查询日志进行分类汇总。mysqldumpslow对日志文件进行了分类汇总,显示汇总后摘要结果。

    有关mysqldumpslow命令的用法可以参考其帮助:#mysqldumpslow  --help

    [root@mysql data]# mysqldumpslow -a -s at -r slow-query.log 
    
    
    Reading mysql slow query log from slow-query.log
    Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), 0users@0hosts
      Time: 2016-09-06T15:54:42.648291Z
      # User@Host: root[root] @ localhost []  Id:    14
      # Query_time: 0.017319  Lock_time: 0.000612 Rows_sent: 1  Rows_examined: 20001
      SET timestamp=1473177282;
    
    select * from test1.tb1 where entertime <> '2016-9-3'

    上面显示结果中就是一条慢查询,如何优化呢?

    优化前查询0.01秒


    一是在entertime列上创建索引优化查询

    mysql> create index index_entertime on test1.tb1(entertime);

    二是优化这个sql查询语句

    mysql> select * from test1.tb1 where entertime < '2016-9-3' or entertime > '2016-9-3';

    从下图可以看查询0.00秒


    使用mysqldumpslow命令可以非常明确的得到各种我们需要的查询语句,对MySQL查询语句的监控、分析、优化是MySQL优化非常重要的一步。开启慢查询日志后,由于日志记录操作,在一定程度上会占用CPU资源影响mysql的性能,但是可以阶段性开启来定位性能瓶颈。

    explain分析查询

    使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。通过explain命令可以得到:

    mysql> explain select * from test1.tb1 where stuname='admin'\G;
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: tb1
       partitions: NULL
             type: ALL      //全表扫描
    possible_keys: NULL
              key: NULL
          key_len: NULL
              ref: NULL
             rows: 19986
         filtered: 10.00
            Extra: Using where    //使用where过滤数据
    1 row in set, 1 warning (0.00 sec)
    EXPLAIN字段:
    Table:显示这一行的数据是关于哪张表的
    type:这是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型为system、const、eq_reg、ref、range、index和ALL
    possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。
    key:实际使用的索引。如果为NULL,则没有使用索引。
    key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
    ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
    rows:MySQL认为必须检索的用来返回请求数据的行数
    Extra:关于MYSQL如何解析查询的额外信息
    

    从上面的explain模拟优化器执行sql语句来看是没有使用索引查询的,而是全表扫描

    优化方法:在stuname列上创建索引

    mysql> create index index_stuname on test1.tb1(stuname);

    再次执行explain


    显示结果说明该查询语句使用了index_stuname索引查询数据而非全表扫描。

    profiling分析查询

    通过慢日志查询可以知道哪些SQL语句执行效率低下,通过explain我们可以得知SQL语句的具体执行情况,索引使用等,还可以结合show命令查看执行状态。如果觉得explain的信息不够详细,可以同通过profiling命令得到更准确的SQL执行消耗系统资源的信息。

    profiling默认是关闭的。可以通过以下语句查看

    mysql> show variables like '%profiling%';    //off表示未开启

    mysql> select @@profiling;     //0表示未开启

    打开profiling功能: mysql>set profiling=1; 执行需要测试的sql 语句:

    mysql> select @@profiling;


    执行要测试的sql语句


    mysql> show profile for query 2;  //得到对应SQL语句执行的详细信息

    status:是profile里的状态,duration:是status状态下的耗时。因此我们关注的就是那个状态最耗时,这些状态中那些可以优化。

    当然也可以查看更多的信息如CPU等等

    SHOW PROFILE [type [, type] ... ]  [FOR QUERY n]
    type:
    
     ALL:显示所有的开销信息
          BLOCK IO:显示块IO相关开销
          CPU:显示用户CPU时间、系统CPU时间
          IPC:显示发送和接收相关开销信息
           PAGE FAULTS:显示页面错误相关开销信息 
          SWAPS:显示交换次数相关开销的信息
    

    测试完成之以后,记得要关闭调试功能,以免影响数据库的正常使用:

    mysql> set profiling=0;

    2、配置优化


    Mysql参数优化对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能得到最佳效果。

    下面列出了对性能优化影响较大的主要变量,主要分为连接请求的变量和缓冲区变量

     1.连接请求的变量:

    (1.)max_connections

    MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多, MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。

    数值过小会经常出现ERROR 1040: Too many connections错误,可以过mysql> showstatus like 'connections';通配符查看当前状态的连接数量(试图连接到MySQL(不管是否连接成功)的连接数),以定夺该值的大小。

    mysql>show variables like ‘max_connections’ 最大连接数
    mysql>show  status like ‘max_used_connections’ 响应的连接数
    max_used_connections / max_connections * 100% (理想值≈ 85%) 
    

    如果max_used_connections跟max_connections相同那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大。

    如何设置max_connections?

    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容,如设置最大连接数为1024

    max_connections = 1024

    重启mysql服务

    (2.)back_log

    MySQL能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,它就会起作用。如果MySQL的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。

    back_log值指出在MySQL暂时停止回答新请求之前的短时间内有多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它。

    当观察你主机进程列表(mysql> show full processlist),发现大量

    xxxxx | unauthenticated user |xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大back_log的值了或加大max_connections的值。

    通过mysql> show variables like 'back_log';查看back_log的设置

    如何设置back_log?

    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容,如设置最大连接数为1024

    back_log = 数值

    重启mysql服务

    (3.)wait_timeoutinteractive_timeout

    wait_timeout -- 指的是MySQL在关闭一个非交互的连接之前所要等待的秒数

    interactive_time -- 指的是mysql在关闭一个交互的连接之前所要等待的秒数,比如我们在终端上进入mysql管理,使用的即使交互的连接,这时候,如果没有操作的时间超过了interactive_time设置的时间就会自动断开。默认数值是28800,可调优为7200。

    对性能的影响:

    wait_timeout:

    (1)如果设置大小,那么连接关闭的很快,从而使一些持久的连接不起作用

    (2)如果设置太大,容易造成连接打开时间过长,在show processlist时,能看到太多的sleep状态的连接,从而造成too many connections错误

    (3)一般希望wait_timeout尽可能地低

    interactive_timeout的设置将要对你的webapplication没有多大的影响

    查看wait_timeout和interactive_timeout

    mysql> show variables like '%wait_tmeout%';
    mysql> show variables like '%interactive_timeout%';
    

    如何设置wait_timeout和interactive_timeout?

    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容

    wait_timeout=100
    interactive_timeout=100
    

    重启MySQL Server进入后,查看设置已经生效。

    2.绶冲区变量

    全局缓冲:

    (1.)key_buffer_size

    key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOWSTATUS LIKE ‘key_read%’获得)。


    一共有14 个索引读取请求,有5 个请求在内存中没有找到直接从硬盘读取索引,计算索引 未命中缓存的概率  
    key_cache_miss_rate = Key_reads / Key_read_requests * 100% =50% 

    key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。


    如何调整key_buffer_size

    默认配置数值是8388608(8M),主机有4GB内存,可以调优值为268435456(256MB)

    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容

    key_buffer_size=268435456或key_buffer_size=256M

    重启MySQL Server进入后,查看设置已经生效。

    (2.)query_cache_size(查询缓存简称QC)

    使用查询缓冲,MySQL将查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。

    一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用查询缓存。

    注:两个SQL语句,只要相差哪怕是一个字符(例如大小写不一样;多一个空格等),那么这两个SQL将使用不同的一个CACHE。

    通过检查状态值’Qcache%’,可以知道query_cache_size设置是否合理(上述状态值可以使用SHOW STATUS LIKE ‘Qcache%’获得)。


    Qcache_free_blocks缓存中相邻内存块的个数。如果该值显示较大,则说明Query Cache 中的内存碎片较多了,FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。 

    注意:当一个表被更新之后,和它相关的cache blocks将被free。但是这个block依然可能存在队列中,除非是在队列的尾部。可以用FLUSH QUERY CACHE语句来清空free blocks
    Qcache_free_memoryQuery Cache 中目前剩余的内存大小。通过这个参数我们可以较为准确的观察出当前系统中的Query Cache 内存大小是否足够,是需要增加还是过多了。
    Qcache_hits:表示有多少次命中缓存。我们主要可以通过该值来验证我们的查询缓存的效果。数字越大,缓存效果越理想。
    Qcache_inserts示多少次未命中然后插入,意思是新来的SQL请求在缓存中未找到,不得不执行查询处理,执行查询处理后把结果insert到查询缓存中。这样的情况的次数越多,表示查询缓存应用到的比较少,效果也就不理想。当然系统刚启动后,查询缓存是空的,这很正常。
    Qcache_lowmem_prunes多少条Query 因为内存不足而被清除出QueryCache。通过“Qcache_lowmem_prunes”和“Qcache_free_memory”相互结合,能够更清楚的了解到我们系统中Query Cache 的内存大小是否真的足够,是否非常频繁的出现因为内存不足而有Query 被换出。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的free_blocksfree_memory可以告诉您属于哪种情况) 
    Qcache_not_cached不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。 
    Qcache_queries_in_cache当前Query Cache 中cache 的Query 数量; 
    Qcache_total_blocks当前Query Cache 中的block 数量; 

    我们再查询一下服务器关于query_cache的配置:


    上图可以看出query_cache_type为off表示不缓存任何查询

    各字段的解释:

    query_cache_limit:超过此大小的查询将不缓存 
    query_cache_min_res_unit:缓存块的最小大小 ,query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。
    query_cache_size:查询缓存大小 (注:QC存储的最小单位是1024 byte,所以如果你设定了一个不是1024的倍数的值,这个值会被四舍五入到最接近当前值的等于1024的倍数的值。)
    query_cache_type:缓存类型,决定缓存什么样的查询,注意这个值不能随便设置,必须设置为数字,可选项目以及说明如下:


    如果设置为0,那么可以说,你的缓存根本就没有用,相当于禁用了。

    如果设置为1,将会缓存所有的结果,除非你的select语句使用SQL_NO_CACHE禁用了查询缓存。

    如果设置为2,则只缓存在select语句中通过SQL_CACHE指定需要缓存的查询。

    修改/etc/my.cnf,配置完后的部分文件如下:

    query_cache_size=256M
    query_cache_type=1
    

    保存文件,重新启动MYSQL服务,然后通过如下查询来验证是否真正开启了:


    query_cache_wlock_invalidate:当有其他客户端正在对MyISAM表进行写操作时,如果查询在querycache中,是否返回cache结果还是等写操作完成再读表获取结果。  

    查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100% 
    如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。 
    查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100% 
    查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。
    查询缓存命中率 = Qcache_hits/(Qcache_hits +Qcache_inserts) * 100% 

    Query Cache的限制

    a) 所有子查询中的外部查询SQL 不能被Cache;
    b) 在Procedure,Function 以及Trigger 中的Query 不能被Cache;
    c) 包含其他很多每次执行可能得到不一样结果的函数的Query不能被Cache。
    鉴于上面的这些限制,在使用Query Cache 的过程中,建议通过精确设置的方式来使用,仅仅让合适的表的数据可以进入Query Cache,仅仅让某些Query的查询结果被Cache。

    如何设置query_cache_size?

    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容

    query_cache_size=256M
    query_cache_type=1
    

    重启MySQL Server进入后,查看设置已经生效。

    (3.)max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况,当超过指定次数,MYSQL服务器将禁止host的连接请求,直到mysql服务器重启或通过flush hosts命令清空此host的相关信息。max_connect_errors的值与性能并无太大关系。

    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容

    max_connect_errors=20

    重启MySQL Server进入后,查看设置已经生效。

    (4.)sort_buffer_size

    每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUPBY操作。

    Sort_Buffer_Size 是一个connection级参数,在每个connection(session)第一次需要使用这个buffer的时候,一次性分配设置的内存。
    Sort_Buffer_Size 并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。例如:500个连接将会消耗 500*sort_buffer_size(2M)=1G内存

    例如设置sort_buffer_size

    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容

    sort_buffer_size = 2M

    重启MySQL Server进入后,查看设置已经生效。

     (5.) max_allowed_packet = 32M

    MySQL根据配置文件会限制Server接受的数据包大小。有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败。最大值是1GB,必须设置1024的倍数。
    (6.)join_buffer_size = 2M   

    用于表间关联缓存的大小,和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。

    (7.)thread_cache_size = 300   

    服务器线程缓存,这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时,那么客户端的线程将被放到缓存中以响应下一个客户而不是销毁(前提是缓存数未达上限),如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。设置规则如下:1GB 内存配置为8,2GB配置为16,3GB配置为32,4GB或更高内存,可配置更大。服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)


    试图连接到MySQL(不管是否连接成功)的连接数


    Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。
    Threads_connected :代表当前已建立连接的数量,因为一个连接就需要一个线程,所以也可以看成当前被使用的线程数。
    Threads_created :代表从最近一次服务启动,已创建线程的数量,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值。
    Threads_running :代表当前激活的(非睡眠状态)线程数。并不是代表正在使用的线程数,有时候连接已建立,但是连接处于sleep状态。
    3.配置InnoDB的几个变量


    (1.)innodb_buffer_pool_size

    对于InnoDB表来说,innodb_buffer_pool_size的作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最大可以把该值设置成物理内存的80%。根据MySQL手册,对于2G内存的机器,推荐值是1G(50%)。 如果你的数据量不大,并且不会暴增,那么无需把 innodb_buffer_pool_size 设置的太大了。


    设置innodb_buffer_pool_size

    修改/etc/my.cnf文件,在[mysqld]下面添加如下内容

    innodb_buffer_pool_size = 2048M
    重启MySQL Server进入后,查看设置已经生效。

    (2.)innodb_flush_log_at_trx_commit

    主要控制了innodb将log buffer中的数 1写入日志文件并flush磁盘的时间点,取值分别为0、1、2三个。0,表示当事务提交时,不做日志写入操作,而是每秒钟将log buffer中的数据写入日志文件并flush磁盘一次;1,则在每秒钟或是每次事物的提交都会引起日志文件写入、flush磁盘的操作,确保了事务的ACID;设置为2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次flush磁盘操作。

    实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。

    根据MySQL手册,在允许丢失最近部分事务的危险的前提下,可以把该值设为0或2。

    (3.)innodb_thread_concurrency = 0   

    此参数用来设置innodb线程的并发数量,默认值为0表示不限制,若要设置则与服务器的CPU核数相同或是cpu的核数的2倍,建议用默认设置,一般为8.

    (4.)innodb_log_buffer_size

    此参数确定些日志文件所用的内存大小,以M为单位。缓冲区更大能提高性能,对于较大的事务,可以增大缓存大小。

    innodb_log_buffer_size=32M
    (5.)innodb_log_file_size = 50M   

    此参数确定数据日志文件的大小,以M为单位,更大的设置可以提高性能.

    (6.)innodb_log_files_in_group= 3  

    为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为3

    (7.)read_buffer_size = 1M  

    MySql读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为它分配一段内存缓冲区。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。和 sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。

    (8.)read_rnd_buffer_size = 16M  

    MySql 的随机读(查询操作)缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。
    注:顺序读是指根据索引的叶节点数据就能顺序地读取所需要的行数据。随机读是指一般需要根据辅助索引叶节点中的主键寻找实际行数据,而辅助索引和主键所在的数据段不同,因此访问方式是随机的。

    (9.)bulk_insert_buffer_size = 64M   

    批量插入数据缓存大小,可以有效提高插入效率,默认为8M

    (10.)binary log 

    log-bin=/usr/local/mysql/data/mysql-bin

    binlog_cache_size = 2M  //为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存, 提高记录bin-log的效率。没有什么大事务,dml也不是很频繁的情况下可以设置小一点,如果事务大而且多,dml操作也频繁,则可以适当的调大一点。前者建议是--1M,后者建议是:即 2--4M

    max_binlog_cache_size = 8M //表示的是binlog 能够使用的最大cache 内存大小

    max_binlog_size= 512M  //指定binlog日志文件的大小,如果当前的日志大小达到max_binlog_size,还会自动创建新的二进制日志。你不能将该变量设置为大于1GB或小于4096字节。默认值是1GB。在导入大容量的sql文件时,建议关闭sql_log_bin,否则硬盘扛不住,而且建议定期做删除。

    expire_logs_days = 7  //定义了mysql清除过期日志的时间。
    二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。

    mysqladmin flush-logs 也可以重新开始新的binarylog 

    在优化之前执行mysqlslap工具进行测试

    mysql> mysqlslap --defaults-file=/etc/my.cnf --concurrency=10 --iterations=1 --create-schema='tables' --query='select * from tables.tb1' --engine=innodb --number-of-queries=2000 -uroot -ppwd123 –verbose;
    
    

    显示结果:


    优化之后执行mysqlslap工具进行测试


    相关优化参数总结:

    [mysqld]
    slow_query_log = 1
    slow_query_log_file = /usr/local/mysql/data/slow-query.log
    long_query_time = 1
    log-queries-not-using-indexes
    max_connections = 1024
    back_log = 128
    wait_timeout = 60
    interactive_timeout = 7200
    key_buffer_size=256M
    query_cache_size = 256M
    query_cache_type=1
    query_cache_limit=50M
    max_connect_errors=20
    sort_buffer_size = 2M
    max_allowed_packet=32M
    join_buffer_size=2M
    thread_cache_size=200
    innodb_buffer_pool_size = 2048M
    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size=32M
    innodb_log_file_size=128M
    innodb_log_files_in_group=3
    log-bin=mysql-bin
    binlog_cache_size=2M
    max_binlog_cache_size=8M
    max_binlog_size=512M
    expire_logs_days=7
    read_buffer_size=1M
    read_rnd_buffer_size=16M
    bulk_insert_buffer_size=64M
    log-error = /usr/local/mysql/data/mysqld.err

    到这里有关于MySQL影响性能的因素原因以及性能优化配置就演示完毕了!!!

    希望对你有所帮助!!!@@@再见!!!!!再见再见再见









    展开全文
  • 详解NVMe SSD存储性能影响因素

    千次阅读 2018-11-03 07:21:50
    导读: NVMe SSD的性能时常捉摸不定,为此我们需要打开SSD的神秘盒子,从各个视角分析SSD性能影响因素,并思考从存储软件的角度如何最优化使用NVMe SSD,推进...
  • 影响手机成像质量的因素

    千次阅读 2016-07-19 16:34:49
    今时今日,手机已经不仅仅是人们的通讯工具,...影响手机成像质量的因素主要有两个:摄像头和成像算法。成像算法也是非常重要的,就像炒菜一样,同样的材料,经过不同的厨师的处理,味道也会不一样。但是成像算法是每家
  • 样本大小的确定Congratulations, your experiment has yielded significant results! You can be sure (well, 95% sure) that the independent variable influenced your dependent variable. I guess all you have ...
  • 文章目录影响性能的几个因素 影响性能的几个因素 硬件资源(CPU 、内存、磁盘等) 操作系统的区别 MySQL的存储引擎的选择 MyISAM: 不支持事务,表级锁 InnoDB: 事务级存储引擎,完美支持行级锁,事务ACID...
  • [Oracle.11g权威指南(第2版)].谷长勇.扫描版.pdf

    千次下载 热门讨论 2013-06-23 21:16:09
    5.2.5 使用DISTINCT检索唯一的表列 80 5.2.6 使用算术运算符 81 5.3 基本函数的使用 82 5.3.1 字符函数 82 5.3.2 数字函数 85 5.3.3 日期函数 87 5.3.4 转换函数 87 5.3.5 组函数 88 5.3.6 使用GROUP BY进行数据...
  • Linux下熵池大小导致的一些问题

    千次阅读 2019-10-15 14:48:43
    /proc/sys/kernel/random/entropy_avail中存储了熵池现在的大小,/proc/sys/kernel/random/poolsize是熵池的最大容量,单位都是bit。如果entropy_avail的小于要产生的随机数bit数,那么/dev/random就会堵塞。 那么...
  • 声明:本文讨论主题的不是严谨意义上的“因果关系”,而是探讨自变量与因变量的关系(实际上不是真的因果关系),主要关注点在于找到并验证影响(或预测)因变量Y的自变量X。同前文...
  • 转载来源:[射频百花潭]《非常实用: 2.4G天线设计指南(赛普拉斯工程师力作)》 本文章使用简单的术语介绍了天线的设计情况,并推荐了两款经过赛普拉斯测试的低成本PCB天线。这些PCB天线能够与赛普拉斯PRoC™和PSoC®...
  • 结果表明,在所选的因素水平范围内,葡萄糖和pH对产气量影响显著,pH和Fe2+之间交互作用显著,煤用量大小影响不太明显.实验证明,培养基中葡萄糖用量为6g/L,初始pH为5.5,煤基质用量为50g/L,FeCl2·4H2O用量为10mg/L...
  • 汽油是小型车辆的主要燃料,汽油燃烧产生的尾气排放对大气环境有重要影响。为此,世界各国都制定了日益严格的汽油质量标准(见下表)。汽油清洁化重点是降低汽油中的硫、烯烃含量,同时尽量保持其辛烷。 欧盟和...
  • 影响elasticsearch性能因素总结

    万次阅读 2016-05-12 11:13:18
     因为默认情况下es对字段数据缓存(Field Data Cache)大小是无限制的,查询时会把字段放到内存,特别是facet查询,对内存要求非常高,它会把结果都放在内存,然后进行排序等操作,一直使用内存,直到内存用完,...
  • 超硬核!操作系统学霸笔记,考试复习面试全靠它

    万次阅读 多人点赞 2021-03-22 18:43:49
    1)顺序性:处理机严格按照程序所规定的顺序执行,每一步操作必须在下一步操作开始前执行 2)封闭性:程序在封闭的环境下运行,程序独占资源,资源的状态由程序决定,程序一旦开始执行,外界环境不会影响程序的执行...
  • Python:多指标权重确定方法—熵法 一、需准备的资料 1.一份excel的数据表格,列为指标(评价指标),行为城市(研究对象,也可以是年份,) city GDP:亿元x.1 人口(万)x.2 城镇化率(%)x.3 从业人员(万)x.4 ...
  • 有些其他优化算法本质上是迭代的,但是应用于这一类的优化问题时,能在可接受的时间内收敛到可接受的解,并且与初始无关。深度学习训练算法通常没有这两种奢侈的性质。深度学习模型的训练算法通常是迭代的,因此...
  • 图像的灰度化就是让像素点矩阵中的每一个像素点都满足关系:R=G=B,此时的这个叫做灰度。如RGB(100,100,100)就代表灰度为100,RGB(50,50,50)代表灰度为50。 灰度化处理 一般灰度化处理的方法:在灰度化的图像...
  • 灰度、灰度级、分辨率、像素

    万次阅读 多人点赞 2017-09-18 20:01:04
    ​1、像素点 像素点是最小的图像单元,一张图片由好多的像素点组成。如下图     可以看到上述图片尺寸是500 * 338 的,表示图片是由一...把鼠标放在一个图片上,这个时候会显示尺寸和大小,这里的尺寸就是像素...
  • 如何设置Spark Executor Memory的大小

    万次阅读 2019-06-21 17:42:37
    三、Spark内存模型 注:2.0+和2.0以前的版本默认值不同(spark.memory.fraction Spark2.0+默认值0.6 Spark1.6默认值0.75) 图1 Spark统一内存管理模型示意图 四、设置Executor内存大小的时候要考虑的因素 以下情况...
  • 数据库连接池大小到底多少合适?

    万次阅读 多人点赞 2020-06-09 11:59:22
    基本上来说,大部分项目都需要跟数据库做交互,那么,数据库连接池的大小设置成多大合适呢? 一些开发老鸟可能还会告诉你:没关系,尽量设置的大些,比如设置成 200,这样数据库性能会高些,吞吐量也会大些! 你也许...
  • TCP缓冲区大小及限制

    千次阅读 2019-03-14 17:56:35
    TCP缓冲区大小及限制 这个问题在前面有的部分已经涉及,这里在重新总结下。主要参考UNIX网络编程。 (1)数据报大小 IPv4的数据报最大大小是65535字节,包括IPv4首部。因为首部中说明大小的字段为16位。 IPv6的数据...
  • 思维导图概述一个数据库是否存在性能问题,基本上在系统设计的时候就决定了,这个系统...软件设计对数据库的影响软件架构设计对数据库性能的影响软件系统的架构对数据库的影响是非常直接的。 比如一套并发量非常大的
  • 法是一种依据各指标所包含的信息量大小,来确定决策指标权重的客观赋权法。 灰色系统理论的研究对象是部分信息已知而部分信息未知的“贫信息”’不确定性系统,利用已知信息来确定系统的未知信息,对样本量...
  • 统计学上,算术平均较中位数和众数更少受到随机因素影响, 但缺点是它极易受到极大极小的影响。例如,有数组 (5, 7, 5, 4, 6, 7, 8, 5, 4, 7, 8, 6, 20),平均是 7.1,但实际上大部分数据(10个)都不超过7,...
  • CentOS影响java的线程数的因素

    千次阅读 2016-07-07 13:20:06
    对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个: -Xms intial java heap size -Xmx maximum java heap ...
  • mysql对表列数和行大小的限制

    千次阅读 2019-11-24 01:13:28
    MySQL对于每个表具有4096个列的硬限制,但给定表的有效最大可能较少。精确的列限制取决于几个因素: 表的最大行大小限制列的数量(可能是大小),因为所有列的总长度不能超过此大小。请参阅行大小限制 ...
  • hadoop 切片机制详解

    万次阅读 2022-01-02 15:19:43
    哪些因素影响了MapTask并行度? MapTask并行度决定机制 数据块:Block是HDFS物理上的单位,即把数据分成一块一块的,数据块是HDFS存储数据单位 数据切片:数据切片只在逻辑上对输入进行分片,并不是真的会在磁盘上将...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,026
精华内容 22,010
关键字:

影响g值大小的因素