单机数据库优化的一对实践

其次节 Hadoop安装与运用

2.1 Hadoop简介
2.2 MR实现第一节作业
2.3 HDFS分布式存储系统
2.4 单机安装 
2.5 分布式集群搭建
2.6 课后作业

3、数据库连接池优化

数据库连接池本质上是一种缓存,它是一种抗高并发的手腕。数据库连接池优化紧若是对参数举行优化,一般大家拔取DBCP连接池,它的切切实实参数如下:

【Hadoop大数目基础】##

3.10、testWhileIdle

开启了今后,后台清理连接的线程会没隔一段时间对空闲连接进行validateObject,借使连接失效则会举行铲除,不影响属性,提议拉开

2.6 课后学业##\

  1. 搭建一个3个节点的Hadoop分布式环境
  2. 用MR的办法贯彻率先课的课业,对文件举办总结,输出统计结果到HDFS

越来越多课程可以关心

【微信公众号】小张网校

万众号内有微信群,扫描出席后更加多大牛调换学习

3.12、预热连接池

对此连接池,提议在起步应用的时候进行预热,在还未对外提供访问从前开展简短的sql查询,让连接池充满需求的连接数。

2.2 MR完结率先节作业

首先运行计算就要启动mapreduce,我们刚刚才启动了start-dfs.sh (HDFS文件系统),所以不能计算那么我们把mapreduce的程序也启动起来。

启动mapreduce命令
[root@localhost hadoop]# start-yarn.sh 
starting yarn daemons
starting resourcemanager, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/yarn-root-resourcemanager-localhost.localdomain.out
localhost: starting nodemanager, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/yarn-root-nodemanager-localhost.localdomain.out

启动完成以后我们调用"jps"命令看是否真的启动成功了
28113 NodeManager
28011 ResourceManager
28442 Jps
27137 NameNode
27401 SecondaryNameNode
27246 DataNode

可以很明显的看到多出来两个程序。

始建测试文件

创建一个测试的数据:
vi /opt/test/test.txt
麒麟
小张
张张
果哥
泽安
跨越
天天顺利
泽安
祖渊
张张

2.2-01.jpg

将测试文件上传来HDFS
第一大家要在HDFS上再创设三个公文,一个 input(输入) /
ouput(输出)的文书夹。

[root@localhost ~]# hdfs dfs -mkdir /input /ouput
16/10/26 04:30:33 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

将测试数据上传到"input"文件夹
[root@localhost ~]# hdfs dfs -put /opt/test/test.txt /input
16/10/26 04:33:03 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

查看是上传成功
[root@localhost ~]# hdfs dfs -cat /input/test.txt
16/10/26 04:34:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
麒麟
小张
张张
果哥
泽安
跨越
天天顺利
泽安
祖渊
张张

调用Hadoop自带的WordCount方法

[root@localhost ~]# hadoop jar /opt/hadoop/hadoop-2.6.0-cdh5.8.2/share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.8.2.jar wordcount /input /ouput/test
16/10/26 04:49:37 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
16/10/26 04:49:38 INFO client.RMProxy: Connecting to ResourceManager at localhost/127.0.0.1:8032
16/10/26 04:49:42 INFO input.FileInputFormat: Total input paths to process : 1
16/10/26 04:49:43 INFO mapreduce.JobSubmitter: number of splits:1
16/10/26 04:49:44 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1477471653063_0001
16/10/26 04:49:46 INFO impl.YarnClientImpl: Submitted application application_1477471653063_0001
16/10/26 04:49:47 INFO mapreduce.Job: The url to track the job: http://localhost:8088/proxy/application_1477471653063_0001/
16/10/26 04:49:47 INFO mapreduce.Job: Running job: job_1477471653063_0001
16/10/26 04:50:21 INFO mapreduce.Job: Job job_1477471653063_0001 running in uber mode : false
16/10/26 04:50:21 INFO mapreduce.Job:  map 0% reduce 0%
16/10/26 04:50:44 INFO mapreduce.Job:  map 100% reduce 0%
16/10/26 04:51:04 INFO mapreduce.Job:  map 100% reduce 100%
16/10/26 04:51:06 INFO mapreduce.Job: Job job_1477471653063_0001 completed successfully
16/10/26 04:51:06 INFO mapreduce.Job: Counters: 49
    File System Counters
            FILE: Number of bytes read=116
            FILE: Number of bytes written=232107
            FILE: Number of read operations=0
            FILE: Number of large read operations=0
            FILE: Number of write operations=0
            HDFS: Number of bytes read=177
            HDFS: Number of bytes written=78
            HDFS: Number of read operations=6
            HDFS: Number of large read operations=0
            HDFS: Number of write operations=2
    Job Counters 
            Launched map tasks=1
            Launched reduce tasks=1
            Data-local map tasks=1
            Total time spent by all maps in occupied slots (ms)=18128
            Total time spent by all reduces in occupied slots (ms)=17756
            Total time spent by all map tasks (ms)=18128
            Total time spent by all reduce tasks (ms)=17756
            Total vcore-seconds taken by all map tasks=18128
            Total vcore-seconds taken by all reduce tasks=17756
            Total megabyte-seconds taken by all map tasks=18563072
            Total megabyte-seconds taken by all reduce tasks=18182144
    Map-Reduce Framework
            Map input records=10
            Map output records=10
            Map output bytes=116
            Map output materialized bytes=116
            Input split bytes=101
            Combine input records=10
            Combine output records=8
            Reduce input groups=8
            Reduce shuffle bytes=116
            Reduce input records=8
            Reduce output records=8
            Spilled Records=16
            Shuffled Maps =1
            Failed Shuffles=0
            Merged Map outputs=1
            GC time elapsed (ms)=454
            CPU time spent (ms)=3450
            Physical memory (bytes) snapshot=306806784
            Virtual memory (bytes) snapshot=3017633792
            Total committed heap usage (bytes)=163450880
    Shuffle Errors
            BAD_ID=0
            CONNECTION=0
            IO_ERROR=0
            WRONG_LENGTH=0
            WRONG_MAP=0
            WRONG_REDUCE=0
    File Input Format Counters 
            Bytes Read=76
    File Output Format Counters 
            Bytes Written=78

运行完成我们看看计算出来的结果:
[root@localhost ~]# hdfs dfs -ls /ouput/test
16/10/26 04:53:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rw-r--r--   1 root supergroup          0 2016-10-26 04:51 /ouput/test/_SUCCESS
-rw-r--r--   1 root supergroup         78 2016-10-26 04:51 /ouput/test/part-r-00000

[root@localhost ~]# hdfs dfs -cat /ouput/test/part-r-00000
16/10/26 04:53:41 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
天天顺利        1
小张    1
张张    2
果哥    1
泽安    2
祖渊    1
跨越    1
麒麟    1

4.3、三级索引

假使上边两招还越发,那么就把所查询的字段也添加索引,那时候就形成了所谓的目录覆盖,那样做可以减去四回I/O操作,因为mysql在查询数据的时候,是先查主键索引,然后依照主键索引去查普通索引,然后依据普通索引去查相对应的笔录。假使大家所急需的记录在平常索引里都有,那就不须要第三步了。当然,那种建索引的法门相比极端,不相符一般景色。

2.3 HDFS分布式存储系统

HDFS优点

  1. 高容错性
    1. 数据自动保存多少个副本
    2. 副本都时候会自行回复
  2. 顺应批量甩卖
    1. 移步计量而非数据
    2. 数据地方揭露给统计框架
  3. 适合大数目处理
    1. GB/TB/甚至PB级数据
    2. 百万层面以上文件数量
    3. 10k+
  4. 可打造廉价的机器上
    1. 不论是机器人有多么的垃圾堆,只要有空间内存就足以搭建Hadoop

****HDFS缺点****

  1. 低顺延数据访问
    1. 诸如阿秒级
    2. 低顺延与高吞吐率
  2. 小文件存取
    1. 侵占NameNode大量内存
    2. 寻道时间超越读取时间
  3. 并发写入/文件擅自修改
    1. 一个文书只可以有一个写者
    2. 只支持append

HDFS架构

2.3-01.jpg

如图所示,HDFS是遵循Master和Slave的社团

NameNode:接近项目CEO职位 下达需要,监控团体进度,工作分配。
管理数据块映射;处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;

NameNode的主要功能:接受客户端的读写服务。
    上传文件 读取文件都要联系NameNode
Namenode保存了metadate信息,而metadate保存着datanode的元数据 包含了block的位置信息(路径),以及datanode的详细信息。
Namenode的metadate信息启动后会加载到内存,metadate存储到磁盘的文件名;"fsimage",但是其中不包含Block的位置信息,而block的位置信息是在每一次Datanode启动的时候将block的位置信息发送给NameNode 内存中。
**edits**记录对metadate的操作日志。

SecondaryNameNode:好像老板助理的地点 分担领导(Namenode)的工作量;

SecondaryNameNode他不是主节点也不是从节点,它是用来辅助NameNode来完成editslog操作日志的。
合并edits的操作可以配置:
    设置fs.checkpoint.period 默认3600秒
    设置edits log大小fs.checkpoint.size规定edits文件的最大默认64MB

NN合并流程

DataNode:
程序员干活的,上头(NameNode)下达一个急需作用需求你(DataNode)落成。存储client发来的数码块block;执行数据块的读写操作。

dataNode(block)它是数据存储单元,就是数据真正存储的地方。每一个block都会被固定大小的数
据块,默认数据块的大小是64MB**可配置**。

问:我这个文件大小没有达到64MB怎么办呢?
答:如果该文件还不到64MB的时候,则单独成一个block

问:那如果大于64MB怎么办?
答:如果大了就在切分一个block出来,就像我们切肉/切菜一样,想把他们切的均衡(64MB),假如肉切的1厘米,到最后还剩下3厘米怎么办?那就继续再切分。

datanode设计思想

如图所示

假如我上传文件大小为"50G"-->切分为多个block。

每一个Block都会有一个3个副本(可布署)

每一个block的3个副本都存在不同的节点(机器)上,如图"block1"。

HDFS写流程

不难易行易懂

1.HDFS Client-->NameNode:我要上次新文件
2.NameNode检查DataNode空间,检查出: xxx机器上的节点可以存储
3.NameNode上传
4.记录log日志

下边是专业术语

客户端调用create()来创建文件

DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。

元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。

DistributedFileSystem返回DFSOutputStream,客户端用于写数据。

客户端开始写入数据,DFSOutputStream将数据分成块,写入data queue。

Data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。

Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。

DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

如果数据节点在写入的过程中失败:

关闭pipeline,将ack queue中的数据块放入data queue的开始。

当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。

失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。

元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。

写原理

读文件

客户端(client)用FileSystem的open()函数打开文件

DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息。

对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。

DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据。

客户端调用stream的read()函数开始读取数据。

DFSInputStream连接保存此文件第一个数据块的最近的数据节点。

Data从数据节点读到客户端(client)

当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。

在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。

失败的数据节点将被记录,以后不再连接。

读原理

康宁形式

Name启动的时候,首先将印象文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作,一旦在内存中中标建立文件系统元数据映射,则开创一个新的fsimage文件(SecondaryNameNode)和一个空的(edits)编辑日志。
这时Namenode运行”安全情势”,即Namenode的文件系统对于客户端的话是只读的。(显示目录,突显文件内容等。可是增删改都会破产)。

1.3、字段

1.3.1、建了目录的字段必须抬高not null约束,并且安装default值

1.3.2、不指出使用float、double来存小数,防止精度损失,提议利用decimal

1.3.3、不提议选用Text/blob来保存多量数量,因为对大文本的读写会招致比较大的I/O开支,同时占用mysql的缓存,高并发下会极大的大跌数据库的吞吐量,提议将大文本数据保存在特其他文件存储系统中,mysql中只保留那些文件的造访地址,比如博客作品可以保留在文书中,mysql中只保留文件的相对地址。

1.3.4、varchar类型长度指出不用跨越8K。

1.3.5、时间项目指出利用Datetime,不要接纳timestamp,即便Datetime占用8个字节,而timestamp只占用4个字节,可是后者要力保非空,而且后者是对时区敏感的。

1.3.6、提议表中加进gmt_create和gmt_modified四个字段,用来记录数据创立的改动时间。那四个字段建立的缘由是方便查难点。

2.4 单机安装

系统环境

名称 版本 下载
linux centos 百度
jdk 1.7 百度
hadoop 2.6.0 百度

jdk安装

下载地址百度即可,我使用的JDK版本是 1.7 ;

2.4-01.jpg

1.在linux创建一个文件夹放jdk
    mkdir /usr/jvm
2.将jdk移到刚刚创建的JVM文件夹下,也可以解压到jvm文件夹下
    我这里使用解压
    tar -zxvf /opt/hadoop/tar/jdk-7u79-linux-x64.tar.gz -C /usr/jvm/
3.解压完成以后配置JDK环境变量 /etc/profile

    使用命令:
    vi /etc/profile

2.4-02.jpg

    将↓↓↓↓加在profile中    
    export JAVA_HOME=/usr/jvm/jdk1.7.0_79
    export JAVA_BIN=/usr/jvm/jdk1.7.0_79/bin
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    #PATH
    PATH=$PATH:$JAVA_HOME/bin

2.4-03.jpg

==在linux配置中有hadoop在那边先不要管==

4.到这里jdk配置已经完成了,我们需要刷新一下刚刚修改的profile。否则我们改改新配置的参数是无法生效的。

    [root@zero230 tar]# source /etc/profile

5.调用命令查看是否配置成功并且查看版本是否与我们配置的一致

2.4-04.jpg

    [root@zero230 tar]# java -version
    java version "1.7.0_79"
    Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

到这里JDK已经安装完成!

SSH免验证

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

配置Hadoop

一.Hadoop-env.sh

Hadoop也是需要java的,所以我们需要配置(hadoop-env.sh)它调用的java。
vi hadoop-env.sh
它默认的配置是:export JAVA_HOME=${JAVA_HOME}。这样的话必须定义变量才能启动JAVA,所以我们需要将(hadoop-env.sh)里面的JAVA_HOME变量指定的内容改成我们的JAVA安装的绝对路径,我JDK安装的路径在"/usr/bin/java"目录下。
export  JAVA_HOME=/usr/bin/java

二.core-site.xml

我们需要配置两个参数 defaultFS(HDFS默认名称)
//配置HDFS名称
    hdfs:协议头,如:http https 等
    localhost:主机名
    9000:端口
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>
</property>

三.hdfs-site.xml

replication(副本个数 默认为3个),因为我这里搭建的是单机所以只要一个。
    replication:设置的副本个数
<property>
    <name>dfs.replication</name>
    <value>1</value>
</property>

四.mapred-site.xml

==注意:mapred.site.xml开头并不存在,而是mapred-site.xml.template。我们须求运用cp命令一份命名为mapred.site.xml==

<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>

五.yarn-site.xml

 <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<property>
  <name>yarn.resourcemanager.address</name>
  <value>localhost:8032</value>
</property>  

格式化HDFS

1. $ bin/hdfs namenode -format 
    格式化NameNode,不需要每次启动都需要格式化,机器第一次启动的时候需要格式化一次

16/10/26 03:30:03 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]
16/10/26 03:30:03 INFO namenode.NameNode: createNameNode [-format]
16/10/26 03:30:05 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Formatting using clusterid: CID-2eba6061-bea3-4e86-85cc-ebb1b51cf730
16/10/26 03:30:05 INFO namenode.FSNamesystem: No KeyProvider found.
16/10/26 03:30:05 INFO namenode.FSNamesystem: fsLock is fair:true
16/10/26 03:30:06 INFO blockmanagement.DatanodeManager: dfs.block.invalidate.limit=1000
16/10/26 03:30:06 INFO blockmanagement.DatanodeManager: dfs.namenode.datanode.registration.ip-hostname-check=true
16/10/26 03:30:06 INFO blockmanagement.BlockManager: dfs.namenode.startup.delay.block.deletion.sec is set to 000:00:00:00.000
16/10/26 03:30:06 INFO blockmanagement.BlockManager: The block deletion will start around 2016 Oct 26 03:30:06
16/10/26 03:30:06 INFO util.GSet: Computing capacity for map BlocksMap
16/10/26 03:30:06 INFO util.GSet: VM type       = 64-bit
16/10/26 03:30:06 INFO util.GSet: 2.0% max memory 966.7 MB = 19.3 MB
16/10/26 03:30:06 INFO util.GSet: capacity      = 2^21 = 2097152 entries
16/10/26 03:30:06 INFO blockmanagement.BlockManager: dfs.block.access.token.enable=false
16/10/26 03:30:06 INFO blockmanagement.BlockManager: defaultReplication         = 1
16/10/26 03:30:06 INFO blockmanagement.BlockManager: maxReplication             = 512
16/10/26 03:30:06 INFO blockmanagement.BlockManager: minReplication             = 1
16/10/26 03:30:06 INFO blockmanagement.BlockManager: maxReplicationStreams      = 2
16/10/26 03:30:06 INFO blockmanagement.BlockManager: replicationRecheckInterval = 3000
16/10/26 03:30:06 INFO blockmanagement.BlockManager: encryptDataTransfer        = false
16/10/26 03:30:06 INFO blockmanagement.BlockManager: maxNumBlocksToLog          = 1000
16/10/26 03:30:06 INFO namenode.FSNamesystem: fsOwner             = root (auth:SIMPLE)
16/10/26 03:30:06 INFO namenode.FSNamesystem: supergroup          = supergroup
16/10/26 03:30:06 INFO namenode.FSNamesystem: isPermissionEnabled = true
16/10/26 03:30:06 INFO namenode.FSNamesystem: HA Enabled: false
16/10/26 03:30:06 INFO namenode.FSNamesystem: Append Enabled: true
16/10/26 03:30:06 INFO util.GSet: Computing capacity for map INodeMap
16/10/26 03:30:06 INFO util.GSet: VM type       = 64-bit
16/10/26 03:30:06 INFO util.GSet: 1.0% max memory 966.7 MB = 9.7 MB
16/10/26 03:30:06 INFO util.GSet: capacity      = 2^20 = 1048576 entries
16/10/26 03:30:06 INFO namenode.NameNode: Caching file names occuring more than 10 times
16/10/26 03:30:06 INFO util.GSet: Computing capacity for map cachedBlocks
16/10/26 03:30:06 INFO util.GSet: VM type       = 64-bit
16/10/26 03:30:06 INFO util.GSet: 0.25% max memory 966.7 MB = 2.4 MB
16/10/26 03:30:06 INFO util.GSet: capacity      = 2^18 = 262144 entries
16/10/26 03:30:06 INFO namenode.FSNamesystem: dfs.namenode.safemode.threshold-pct = 0.9990000128746033
16/10/26 03:30:06 INFO namenode.FSNamesystem: dfs.namenode.safemode.min.datanodes = 0
16/10/26 03:30:06 INFO namenode.FSNamesystem: dfs.namenode.safemode.extension     = 30000
16/10/26 03:30:06 INFO metrics.TopMetrics: NNTop conf: dfs.namenode.top.window.num.buckets = 10
16/10/26 03:30:06 INFO metrics.TopMetrics: NNTop conf: dfs.namenode.top.num.users = 10
16/10/26 03:30:06 INFO metrics.TopMetrics: NNTop conf: dfs.namenode.top.windows.minutes = 1,5,25
16/10/26 03:30:06 INFO namenode.FSNamesystem: Retry cache on namenode is enabled
16/10/26 03:30:06 INFO namenode.FSNamesystem: Retry cache will use 0.03 of total heap and retry cache entry expiry time is 600000 millis
16/10/26 03:30:06 INFO util.GSet: Computing capacity for map NameNodeRetryCache
16/10/26 03:30:06 INFO util.GSet: VM type       = 64-bit
16/10/26 03:30:06 INFO util.GSet: 0.029999999329447746% max memory 966.7 MB = 297.0 KB
16/10/26 03:30:06 INFO util.GSet: capacity      = 2^15 = 32768 entries
16/10/26 03:30:06 INFO namenode.NNConf: ACLs enabled? false
16/10/26 03:30:06 INFO namenode.NNConf: XAttrs enabled? true
16/10/26 03:30:06 INFO namenode.NNConf: Maximum size of an xattr: 16384
16/10/26 03:30:06 INFO namenode.FSImage: Allocated new BlockPoolId: BP-857467713-127.0.0.1-1477467006754
16/10/26 03:30:06 INFO common.Storage: Storage directory /tmp/hadoop-root/dfs/name has been successfully formatted.
16/10/26 03:30:07 INFO namenode.FSImageFormatProtobuf: Saving image file /tmp/hadoop-root/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
16/10/26 03:30:07 INFO namenode.FSImageFormatProtobuf: Image file /tmp/hadoop-root/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 351 bytes saved in 0 seconds.
16/10/26 03:30:07 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
16/10/26 03:30:07 INFO util.ExitUtil: Exiting with status 0
16/10/26 03:30:07 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost.localdomain/127.0.0.1
************************************************************/
[root@localhost hadoop-2.6.0-cdh5.8.2]#         

格式化

截取后半部分,这样就表示格式化完成

2. sbin/start-dfs.sh
启动HDFS(NameNode,secondarynamenode,DataNode)

[root@localhost hadoop]# start-dfs.sh 
16/10/26 03:57:24 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Starting namenodes on [localhost]
localhost: starting namenode, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/hadoop-root-namenode-localhost.localdomain.out
localhost: starting datanode, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/hadoop-root-datanode-localhost.localdomain.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /opt/hadoop/hadoop-2.6.0-cdh5.8.2/logs/hadoop-root-secondarynamenode-localhost.localdomain.out
16/10/26 03:58:31 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

2.4-06.jpg

启动完成以后我们调用"jps"命令看是否真的启动成功了
[root@localhost hadoop]# jps
28442 Jps
27137 NameNode
27401 SecondaryNameNode
27246 DataNode

Web浏览HDFS文件

到这一步我们可以通过ip地址访问HDFS文件系统。

[root@localhost hadoop]# ifconfig 
    inet **172.19.4.239**  netmask 255.255.255.0  broadcast 172.19.4.255
    inet6 fe80::250:56ff:fe8d:1144  prefixlen 64  scopeid 0x20<link>
    ether 00:50:56:8d:11:44  txqueuelen 1000  (Ethernet)
    RX packets 1638661  bytes 777256881 (741.2 MiB)
    RX errors 0  dropped 8125  overruns 0  frame 0
    TX packets 333206  bytes 24964212 (23.8 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我这里的地址为 172.19.4.239 那么外部访问的地址是:http://172.19.4.239:50070(默认的端口号)/就可以访问。

2.4-07.jpg

命令操作HDFS文件

我们讲到了配置-->启动,现在我们来讲讲对HDFS文件系统的操作,操作HDFS 在linux中的命令:
[root@localhost hadoop]# hdfs dfs
Usage: hadoop fs [generic options]
    [-appendToFile <localsrc> ... <dst>]
    [-cat [-ignoreCrc] <src> ...]
    [-checksum <src> ...]
    [-chgrp [-R] GROUP PATH...]
    [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
    [-chown [-R] [OWNER][:[GROUP]] PATH...]
    [-copyFromLocal [-f] [-p] [-l] <localsrc> ... <dst>]
    [-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-count [-q] [-h] [-v] <path> ...]
    [-cp [-f] [-p | -p[topax]] <src> ... <dst>]
    [-createSnapshot <snapshotDir> [<snapshotName>]]
    [-deleteSnapshot <snapshotDir> <snapshotName>]
    [-df [-h] [<path> ...]]
    [-du [-s] [-h] <path> ...]
    [-expunge]
    [-find <path> ... <expression> ...]
    [-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
    [-getfacl [-R] <path>]
    [-getfattr [-R] {-n name | -d} [-e en] <path>]
    [-getmerge [-nl] <src> <localdst>]
    [-help [cmd ...]]
    [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [<path> ...]]
    [-mkdir [-p] <path> ...]
    [-moveFromLocal <localsrc> ... <dst>]
    [-moveToLocal <src> <localdst>]
    [-mv <src> ... <dst>]
    [-put [-f] [-p] [-l] <localsrc> ... <dst>]
    [-renameSnapshot <snapshotDir> <oldName> <newName>]
    [-rm [-f] [-r|-R] [-skipTrash] <src> ...]
    [-rmdir [--ignore-fail-on-non-empty] <dir> ...]
    [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
    [-setfattr {-n name [-v value] | -x name} <path>]
    [-setrep [-R] [-w] <rep> <path> ...]
    [-stat [format] <path> ...]
    [-tail [-f] <file>]
    [-test -[defsz] <path>]
    [-text [-ignoreCrc] <src> ...]
    [-touchz <path> ...]
    [-usage [cmd ...]]

Generic options supported are
-conf <configuration file>     specify an application configuration file
-D <property=value>            use value for given property
-fs <local|namenode:port>      specify a namenode
-jt <local|resourcemanager:port>    specify a ResourceManager
-files <comma separated list of files>    specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars>    specify comma separated jar files to include in the classpath.
-archives <comma separated list of archives>    specify comma separated archives to be unarchived on the compute machines.

The general command line syntax is
bin/hadoop command [genericOptions] [commandOptions]

**建立一个文件夹**
[root@localhost hadoop]# hdfs dfs -mkdir /user
16/10/26 04:10:38 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

**查看是否创建成功**
[root@localhost hadoop]# hdfs dfs -ls /
16/10/26 04:12:04 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 1 items
drwxr-xr-x   - root supergroup          0 2016-10-26 04:10 /user

简单命令就讲到这里以后会更单独讲解HDFS

0、前言

数据库优化有过多可以讲,根据支撑的数据量来分可以分成多少个阶段:单机数据库和分库分表,前者一般能够支撑500W或者10G以内的数据,当先那么些值则需求考虑分库分表。此外,一般大公司面试往往会从单机数据库问起,一步一步问到分库分表,中间会穿插很多数据库优化的难题。本文试图描述单机数据库优化的一部分实施,数据库基于mysql,如有不客观的地点,欢迎指正。

2.1 Hadoop简介

     在文章的时候已经讲解了Hadoop的简介以及生态圈,有什么不懂的可以"出门右转"

http://dwz.cn/4rdSdU

3.6、minEvictableIdleTimeMillis

连日保持空闲而不被回收的年月,默许30分钟。

错误记录

[root@localhost ~]# hadoop jar /opt/hadoop/hadoop-2.6.0-cdh5.8.2/share/hadoop/mapreduce2/hadoop-mapreduce-examples-2.6.0-cdh5.8.2.jar wordcount /input /ouput
16/10/26 04:40:32 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
16/10/26 04:40:33 INFO client.RMProxy: Connecting to ResourceManager at /0.0.0.0:8032
16/10/26 04:40:34 WARN security.UserGroupInformation: PriviledgedActionException as:root (auth:SIMPLE) cause:java.net.ConnectException: Call From localhost.localdomain/127.0.0.1 to localhost:9001 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
java.net.ConnectException: Call From localhost.localdomain/127.0.0.1 to localhost:9001 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at org.apache.hadoop.net.NetUtils.wrapWithMessage(NetUtils.java:791)
    at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:731)
    at org.apache.hadoop.ipc.Client.call(Client.java:1475)
    at org.apache.hadoop.ipc.Client.call(Client.java:1408)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:230)
    at com.sun.proxy.$Proxy9.getFileInfo(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getFileInfo(ClientNamenodeProtocolTranslatorPB.java:762)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:256)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:104)
    at com.sun.proxy.$Proxy10.getFileInfo(Unknown Source)
    at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:2121)
    at org.apache.hadoop.hdfs.DistributedFileSystem$19.doCall(DistributedFileSystem.java:1215)
    at org.apache.hadoop.hdfs.DistributedFileSystem$19.doCall(DistributedFileSystem.java:1211)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1211)
    at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:1412)
    at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:145)
    at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:270)
    at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:143)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1307)
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1304)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1693)
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:1304)
    at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1325)
    at org.apache.hadoop.examples.WordCount.main(WordCount.java:87)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:71)
    at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:144)
    at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:74)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.net.ConnectException: Connection refused
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739)
    at org.apache.hadoop.net.SocketIOWithTimeout.connect(SocketIOWithTimeout.java:206)
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:530)
    at org.apache.hadoop.net.NetUtils.connect(NetUtils.java:494)
    at org.apache.hadoop.ipc.Client$Connection.setupConnection(Client.java:614)
    at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:713)
    at org.apache.hadoop.ipc.Client$Connection.access$2900(Client.java:375)
    at org.apache.hadoop.ipc.Client.getConnection(Client.java:1524)
    at org.apache.hadoop.ipc.Client.call(Client.java:1447)
    ... 41 more
[root@localhost ~]# 

问题:没有关闭防火墙
    service iptables stop 关闭
    chkconfig iptables off 永久关闭

1.4、索引创设

1.4.1、那几个等级由于对事情并不精晓,所以尽可能不要盲目加索引,只为一些一定会用到目录的字段加普通索引。

1.4.2、创建innodb单列索引的长短不要当先767bytes,假使跨越会用前255bytes作为前缀索引

1.4.3、成立innodb组合索引的各列索引长度不要跨越767bytes,一共加起来不要超过3072bytes

2.5 分布式集群搭建

系统环境

名称 版本 下载地址
centos 7 百度
JDK 7 百度
hadoop CDH 2.6.0 下载地址)
zero230 172.19.4.230
zero231 172.19.4.231
zero239 172.19.4.239

安装JDK

下载地址百度即可,我使用的JDK版本是 1.7 ;

2.5-01.jpg

1.在linux创建一个文件夹放jdk
    mkdir /usr/jvm
2.将jdk移到刚刚创建的JVM文件夹下,也可以解压到jvm文件夹下
    我这里使用解压
    tar -zxvf /opt/hadoop/tar/jdk-7u79-linux-x64.tar.gz -C /usr/jvm/
3.解压完成以后配置JDK环境变量 /etc/profile

    使用命令:
    vi /etc/profile

2.5-02.jpg

    将↓↓↓↓加在profile中    
    export JAVA_HOME=/usr/jvm/jdk1.7.0_79
    export JAVA_BIN=/usr/jvm/jdk1.7.0_79/bin
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    #PATH
    PATH=$PATH:$JAVA_HOME/bin

2.5-03.jpg

==在linux配置中有hadoop在这边先不用管==

4.到这里jdk配置已经完成了,我们需要刷新一下刚刚修改的profile。否则我们改改新配置的参数是无法生效的。

    [root@zero230 tar]# source /etc/profile

5.调用命令查看是否配置成功并且查看版本是否与我们配置的一致

2.5-04.jpg

    [root@zero230 tar]# java -version
    java version "1.7.0_79"
    Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

到这里JDK已经安装完成!

SSH互免验证

1.在 zero230 zero231 zero239 机器上分别执行一下命令
    ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
    执行完以后会获得 id_dsa(私钥) 和 id_dsa.pub(公钥) 两个文件
2.在zero239 机器上执行该命令
    cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
    意思就是将 公钥 的内容追加到 authorized_keys 文件中。
3.将 zero231/zero230 的 id_dsa.pub(公钥)复制到zero239机器上
    [root@zero230 ~]# scp -r ~/.ssh/id_dsa.pub root@zero239:~/.ssh/230.pub
    [root@zero231 ~]# scp -r ~/.ssh/id_dsa.pub root@zero239:~/.ssh/231.pub
    **注意:**在这里复制到zero239机器上必须重新命令否则会将 zero239 的给覆盖。
4.将 230 231 机器上的 id_dsa.pub 复制到 239机器上了将他们追加到 "authorized_keys" 文件中。
    [root@zero239 ~]# cat ~/.ssh/23*.pub >> ~/.ssh/authorized_keys

2.5-05.jpg

5.将239机器上已经添加了 230/231机器的公钥"authorized_keys"文件复制到230和231机器上
    scp -r ~/.ssh/authorized_keys root@zero230:~/.ssh/
    scp -r ~/.ssh/authorized_keys root@zero231:~/.ssh/
    中有提示(yes/no),选择yes

6.测试SSH是否互通
    ssh zero230 
    回车即可,如果需要输入密码请检查是否配置正确
    [root@zero239 ~]# ssh zero230
    Last login: Thu Oct 27 14:56:54 2016 from a-bg-519.ztequantum.com
    [root@zero230 ~]# exit

配置hadoop

1.将hadoop安装包复制到230 231 239 三台机器上
   使用命令Scp 
2.解压到/opt/hadoop(解压到那个目录下看自己,但一定要记得在哪个目录下)文件夹下,建议*三台机器上的hadoop存放的位置相同*
    tar zxvf /opt/hadoop/tar/hadoop-2.6.0-cdh5.8.2.tar.gz -C /opt/hadoop/
3.修改配置文件
    首先我们要做分布式的Hadoop,那么配置一定需要将他们连串起来,否则怎么可以相互传递数据呢?
参数 说明
fs.defaultFS Namenode 定义,HDFS Url访问地址
io.file.buffer.size 设置缓存的大小

一.core-site.xml

参数 说明
fs.defaultFS Namenode 定义,HDFS Url访问地址
io.file.buffer.size 设置缓存的大小

二.hdfs-site.xml

参数 说明
dfs.namenode.name.dir Namenode 存储的磁盘路径
dfs.datanode.data.dir DataNode 存储的磁盘路径
dfs.blocksize block的大小设置
dfs.replication 节点数量设置,默认为3个。这里230 231 239三个节点,这里可以设置也可以不设置。

三.mapred-site.xml

参数 说明
mapreduce.framwork.name mapreduce.framework.name属性为yarn-tez,就可以替换默认的MR框架为tez引擎。就是管理yarn

四.yarn-site.xml

参数 说明
yarn.resourcemanager.hostname resourcemanager 启动在那台机器上

五.slaves

将 zero239 zero230 zero231 主机名添加进去

2.5-06.jpg

4.配置修改完成以后将它复制分配到各个节点上\
    scp -r /opt/hadoop/hadoop-2.6.0-cdh5.8.2/etc/hadoop/* root@zero230:/opt/hadoop/hadoop-2.6.0-cdh5.8.2/etc/hadoop/

    scp -r /opt/hadoop/hadoop-2.6.0-cdh5.8.2/etc/hadoop/* root@zero231:/opt/hadoop/hadoop-2.6.0-cdh5.8.2/etc/hadoop/

5.格式化hdfs
    hdfs namenode -format

2.5-07.jpg

6.启动hadoop
    方法一: start-dfs.sh 然后 yarn-start.sh
    方法二:start-all.sh

2.5-08.jpg

7.查看进程是否全部启动使用命令:JPS
    239机器:
    [root@zero239 hadoop-2.6.0-cdh5.8.2]# jps
    7518 NodeManager 
    6813 NameNode
    7874 Jps
    5292 DataNode
    7113 SecondaryNameNode
    7404 ResourceManager

    230机器:
    [root@zero230 ~]# jps
    5690 Jps
    5545 NodeManager
    5692 DataNode

    231机器
    [root@zero231 ~]# jps
    3855 NodeManager
    3631 DataNode
    4082 Jps

到这一步说明分布式集群搭建完成。

3.4、maxActive

最大活跃连接数,依据可以接受的产出极值设置。比如单机并发量可承受的极值是100,那么这一个maxActive设置成100后,就只能同时为100个请求服务,多余的伏乞会在最大等待时间过后被撇下。这些值必须安装,可以幸免恶意的出现攻击,爱护数据库。

3.1  initialSize

千帆竞发连接数,那里的初步指的是首先次getConnection的时候,而不是选取启动的时候。开头值可以设置为并发量的历史平均值

2.4、模糊查询like

使用 like
%name%那样的言辞是不会走索引的,相当于全表扫描,数据量小的时候不会有太大的难点,数据量大了随后质量会下落的很厉害,提议数据量大了后头选择搜索引擎来顶替那种歪曲搜索,实在可怜也要在模糊查询前加个能走索引的原则。

3.8、testOnBorrow

报名连接的时候对连年举办检测,不提议拉开,严重影响属性

3.5、maxWait

赢得连接的最大等待时间,提出安装的短一点,比如3s,那样可以让请求火速失利,因为一个请求在等候获取连接的时候,线程是不得以被假释的,而单机的线程并发量是有限的,若是那些日子设置的过长,比如网上提议的60s,那么那几个线程在那60s内是无能为力被假释的,只要那种请求一多,应用的可用线程就少了,服务就变得不可用了。

3.2、minIdle

微小保留的空闲连接数。DBCP会在后台开启一个回收空闲连接的线程,当该线程进行空闲连接回收的时候,会保留minIdle个连接数。一般设置为5,并发量实在很小可以安装为1.

2.5、多表连接

子查询和join都得以兑现在多张表之间取多少,但是子查询质量较差,提议将子查询改成join。对于mysql的join,它用的是Nested
Loop
Join算法,也就是透过前一个表查询的结果集去后一个表中查询,比如前一个表的结果集是100条数据,后一个表有10W数据,那么就须要在100*10W的多少集合中去过滤获得终极的结果集。由此,尽量用小结果集的表去和大表做join,同时在join的字段上确立目录,如若建不了索引,就必要安装丰裕大的join
buffer
size。如果以上的技能都心有余而力不足化解join所带来的属性下跌的难题,那大概就别用join了,将三回join查询拆分成四回简单询问。其余,多表连接尽量不要跨越三张表,领先三张表一般的话品质会很差,提出拆分sql。

5、历史数据归档

当数据量到了一年净增500W条的时候,索引也无力回天,那时候一般的思路都是考虑分库分表。假若事情并未暴发式增进,但是多少的确在缓缓增加,则可以不考虑分库分表那种复杂的技术手段,而是举办历史数据归档。大家本着生命周期已经竣事的野史数据,比如六个月从前的多少,进行归档。我们得以应用quartz的调度任务在凌晨定时将六个月以前的数据查出来,然后存入远程的hbase服务器。当然,大家也亟需提供历史数据的询问接口,以备不时之需。

备注:原文由本人发布在码农网(http://www.codeceo.com/article/database-optimization-practice.html),现在原样转载

澳门美高梅手机网站,2.3、范围查询

限制查询包蕴between、大于、小于以及in。Mysql中的in查询的基准有数量的界定,若数量较小能够走索引查询,若数量较大,就成了全表扫描了。而between、大于、小于等,这个查询不会走索引,所以尽量放在走索引的查询条件未来。

3.3、maxIdle

最大保留的空闲连接数,根据业务出现高峰设置。比如并发高峰为20,那么当高峰过去后,这几个连接不会立马被回收,固然过一小段时间又来一个山上,那么连接池就足以复用这一个空闲连接而不要求频仍创造和倒闭连接。

4.4、索引的选用性

在成立目录的时候,尽量在采用性高的字段上建立。什么是拔取性高呢?所谓接纳性高就是经过这些字段查出来的数据量少,比如根据名字查一个人的新闻,查出来的数据量一般会很少,而依据性别查则可能会把数据库一半的多少都查出来,所以,名字是一个拔取性高的字段,而性别是个挑选性低的字段。

2.1、基本查询

诚如查询需要走索引,借使没有索引提出修改查询,把有目录的那么些字段加上,如若是因为事务场景无法使用这几个字段,那么需求看那些查询调用量大不大,假诺大,比如天天调用10W+,那就需求新增索引,倘使不大,比如每一日调用100+,则足以考虑有限辅助原样。其余,select
*
尽量少用,用到什么字段就在sql语句中加什么,不要求的字段就别查了,浪费I/O和内存空间。

2.2、高效分页

limit m,n其实质就是先实施limit
m+n,然后从第m行取n行,那样当limit翻页越未来翻m越大,质量越低。比如

select * from A limit
100000,10,这种sql语句的习性是很差的,提议改成上边的本子:

selec id,name,age from A where id >=(select id from A limit 100000,1)
limit 10

2、SQL优化

相似的话sql就那么两种:基本的增删改查,分页查询,范围查询,模糊搜索,多表连接

4.2、二级索引

一旦有被order by或者group
by用到的字段,则足以设想在这几个字段上建索引,那样一来,由于索引天然有序,可以幸免order
by以及group by所牵动的排序,从而升高质量。

3.11、numTestsPerEvictionRun

表示每回检查链接的多少,指出安装和maxActive一样大,那样每回可以有效检查有着的链接。

3.9、testOnReturn

归还连接的时候对连日举办检测,不指出拉开,严重影响属性

1、表结构优化

在始发做一个行使的时候,数据库的表结构设计往往会潜移默化使用前期的属性,越发是用户量上来了之后的性质。因而,表结构优化是一个很要紧的步调。

3.7、validationQuery

用以检测延续是不是管用的sql语句,一般是一条不难的sql,指出安装

4、索引优化

当数据量增添到一定水准后,靠sql优化已经黔驴技穷晋级质量了,这时候就要求祭出大招:索引。索引有三级,一般的话领会那三级就够用了,其余,对于建立目录的字段,需要考虑其选取性。

1.1、字符集

诚如的话尽量挑选UTF-8,固然在存早上的时候GBK比UTF-8使用的蕴藏空间少,不过UTF-8包容各国语言,其实大家不要为了那一点储存空间而献身了伸张性。事实上,中期即使要从GBK转为UTF-8所要付出的代价是很高的,须求举办数量迁移,而存储空间完全可以用花钱扩大硬盘来化解。

1.2、主键

在选用mysql的innodb的时候,innodb的平底存储模型是B+树,它使用主键作为聚簇索引,使用插入的数目作为叶子节点,通过主键可以急迅找到叶子节点,从而神速获得记录。因而在设计表的时候需求增加一个主键,而且最好要自增。因为自增主键能够让插入的多寡按主键顺序插入到底层的B+树的纸牌节点中,由于是按序的,那种插入大致不要求去运动已有些其余数据,所以插入效用很高。即使主键不是自增的,那么每一遍主键的值近似随机,那时候就有可能要求活动多量数目来保障B+树的风味,扩充了不须要的付出。

4.1、超级索引

在where后边的规格上确立目录,单列可以建立普通索引,多列则树立整合索引。组合索引需求留意最左前缀原则。

发表评论

电子邮件地址不会被公开。 必填项已用*标注