构建高可用web站点(五)

数据库是web站点中重要的应用,放在第四篇是因为之前来不及总结的原因,在之前的文章我看到了无论是Mysql或者是nosql的一些缓存和分布式一些比较扩展性的功能。但是对于单个数据库来说,它的优化也是我们学习的重点。现在我就来简单说说我自己总结的一些东西。

关于Mysql:Mysql是web站点中应用很广泛的关系型数据库。这一块的东西也是有很多值得学习的东西,介绍的书籍也很多,比如《高性能Mysql》《Mysql性能调优和架构设计》《Mysql技术内幕:InnoDB引擎》等,数据库的知识也是一个很大的宝库,然后我说一下我比较想分享的。也是我日常的笔记,可能逻辑关系不太好,请多多见谅。

从Mysql执行一个查询开始说起:

1、客户端发送一条查询给服务器。

2、服务器先检查缓存(这个检查是通过一个对大小写敏感的哈希查找实现的。),如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。

3、服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划。

4、MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询。

5、将结果返回给客户端。

从中可以看出一些MySQL能够处理的优化类型:

(1)重新定义关联表的顺序

(2)将外链接转化成内连接

(3)使用等价转换规则

(4)优化COUNT()、MIN()、MAX()   没有任何WHERE的COUNT(*)例如MyISAM维护一个变量来存放数据表的行数。

(5)预估并转化为常数表达式

(6)覆盖索引扫描

(7)子查询优化

(8)提前终止查询

(9)列表IN()比较  MySQL将IN()列表中的数据先进行排序,然后通过二分查找的方式来确定列表的值是否满足条件

Mysql这里其实是有一个语法树,对于如何书写SQL能让解析更快,我也是半知半解,就不详细说明,等大家和我继续一起学习

当然,很多人都知道添加索引可以提高数据查询的速度。

根据InnoDB引擎。索引主要有B-Tree索引,HASH索引等。

这里主要讲一下B-Tree索引

主要的特征:就是不论表中的行存储在什么位置,都能够以相同的方法和速度进行查询。

1.索引的创建:

读取表的数据并对其进行排序,如果排序的内存需要超过设定,则排序将使用临时表空间

把排序结果存储在索引段的叶块中,在存储空间到达索引块的PCTFREE之前,该叶块同时也担负着分支块的重任。

当达到PCTFREE时,需要获得新的块用来存储索引行,同时生成一个分支块,在该分支块的头部存储着现有叶块的DBA,新的叶块中开始键值和它的DBA一起构成了分支块的一行数据

能够提高叶块中数据存储密度的方法:

在允许的情况下,尽量减少索引列的数量

尽量使用较大的数据块大小

灵活运用压缩键值的方法。在索引为非唯一索引的情况下,大部分键值都被重复存储,尤其是组合索引中

2.索引块的分割

由于所有的索引行都是按照特定顺序进行存储的,当我们向其中插入新的索引行时,就需要“掰开”两个相互连续的索引行并将新行插入到该位置上。

当中间值被插入时,由于所对应的索引块已经没有空余空间,所以需要分配一个新的索引块并将原来索引块中的行分开存储在两个索引块中。目的是为了放置索引块的连续分割。

不论插入、删除、还是修改,都需要消耗存储空间。所以,需要定期对经常使用的表上的索引执行重构操作。

事务和锁:

锁机制用于管理对共享资源的并发访问。InnoDB存储引擎也会在数据库内部其他多个地方使用锁,从而允许对多种不同资源提供并发访问。例如,操作缓冲池中的LRU列表,删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入。

latch 轻量级的锁,因为其要求锁定的时间必须非常短。若持续的时间长,则应用的性能会非常差。在InnoDB存储引擎中,latch又可以分为mutex(互斥量)和rwlock(读写锁)。其目的是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测的机制。

lock的对象是事务,用来锁定的是数据库中的对象(不同事务隔离级别释放的时间可能不同)

事务隔离级别:

·未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

·提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

·可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读

·串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

脏读: 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。(区分):脏页:指的是缓冲池中已经被修改的页。

不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

幻读:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

InnoDB实现了两种标准的行级锁:

共享锁(S Lock) 允许事务读一行数据

排他锁(X Lock) 允许事务删除或更新一行数据

为了多粒度锁定。InnoDB支持意向锁(Intention Lock)

意向共享锁(IS Lock)一张表中某几行的共享锁

意向排他锁(IX Lock)

最后,讲一下我们平时怎么分析一条sql语句。除了打开例如慢查询日志等方式,还可以通过EXPLAIN来分析你的sql语句:

EXPLAIN中的列

id列  标识SELECT 所属的行

select_type列 Simple:意味查询不包括子查询和UNION。如果有复杂的部分,最外层标记为Primary。其他部分标记如下:

SUBQUERY:包含在SELECT列表中的子查询中的SELECT

DERIVED: MySQL会递归执行并将结果放到一个临时表中。

UNION:在UNION中的第二个和随后的SELECT被标记为UNION

table列:可以从这一列中从上往下观察MySQL的关联优化器为查询选择的关联顺序。

type列:依次从最差到最优:

ALL:全表扫描

index:只是MySQL扫描表时按索引次序进行。主要有点是避免了排序,如果在Extra列中看到Using index,说明MySQL正在使用覆盖索引,只扫描索引数据

range:范围扫描就是一个有限制的索引扫描,它开始于索引里的某一个点,返回匹配这个值域的行。带有Between或在WHERE子句带有>的查询,例如IN()和OR

ref:索引访问,返回所有匹配某个单个值的行。因此它是查找和扫描的混合体

eq_ref:使用这种索引查找,MySQL知道最多返回一条符合条件的记录。这种访问方法可以在MySQL中使用主键或者唯一性索引查找时看到

const,system:当MySQL能对查询的某部分进行优化并将其转换成一个常量时。举例:你通过将某一行的主键放入WHERE子句里的方式来选取此行的主键。

possible_keys列:显示查询可以使用哪些索引

key列:决定使用哪个索引来优化对该表的访问

key_len列:显示MySQL在索引里使用的字节数

ref列:显示了之前的表在key列记录的索引中查找值所用的列或常量。

rows列:读取的行数

Extra列:Using index:将使用覆盖索引

Using where: 将在存储引擎检索行后再进行过滤

Using temporary:使用临时表

时间: 2024-08-06 02:29:25

构建高可用web站点(五)的相关文章

构建高可用web站点学习--前言

前言:本人对于提高web站点的访问量等的有很浓厚的兴趣,也学习了将近一年的时间,希望能总结点东西,虽然很多东西都是从书籍和资料中学习的,而不是原创,但是这是我总结的一点感悟和进行的分类吧. 本系列文章大多为谈论一些基本思想.至于代码实现和服务器的搭建和配置,可能不会涉及到,不过其中会涉及到一些基本的参数配置,所以要求对服务器的搭建和配置有基本的了解.因为搭建和配置的资料网上和书本都 很多,我在这里就能不说就不说了.免得影响文章的长度和关注的焦点. 目录结构: (一)单个服务器如何处理请求 (二)

构建高可用web站点学习(二)

web站点的缓存学习 缓存在web应用里面十分常见,也有各种各样的缓存,从请求开始一直到代码处理的阶段都可以采取缓存.下面就逐一介绍: 一.客户端缓存(浏览器和http方面) 前端页面缓存主要遵循http协议和客户端 如果响应头信息告诉缓存器不要保留缓存:请求信息需要认证或者安全加密:一个缓存的副本如果含有以下信息,内容将会被认为足够新:含有完整的过期时间和寿命控制头信息,并且内容仍在保鲜期内.浏览器已经使用过缓存副本,并且在一个会话中已经检查过内容的新鲜度. Expires(过期时间)属性是h

构建高可用web站点(四)

首先我们来了解负载均衡的概念:英文名称为Load Balance,其意思就是将负载(工作任务)进行平衡.分摊到多个操作单元上进行执行,例如Web服务器.FTP服务器.企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务. 其实负载均衡也是一个很庞大的知识体系.我也不是学习得很完善,这里就是把我自己学过的自我总结一下.分为一下几个方面: (1)基于DNS的负载均衡 学过网络的都知道,DNS的作用主要是将域名映射为IP地址.我们可以采取多个A记录的方式来让别人访问这个网站是解析到一个IP地

构建高可用web站点学习(一)

单个服务器如何处理请求 web服务器最简单的形式就是一个程序,它侦听HTTP请求,在收到一个HTTP请求之后做出回复.当然在接收请求后服务器所做的东西是我们关注的焦点.在下文中也会提及到node是如何简单的实现一个web服务器. 常用的是Apache,tomcat等服务器解决web请求.现在更多的人会使用Nginx解决web请求,这也有一定的道理.本文主要研究各服务器比较成熟的多任务处理方式.下文会详细的提到. Apache: 说到web应用平台,基本上第一反应都是LAMP这个经典的平台.其中A

构建高可用web站点学习(三)

分布式的构建 做为网站访问的生命线(数据访问),当然也可以采用分布式的方法来减轻单台服务器的访问压力.之前有讲过Memcached的分布式,但是Memcached服务器互不通信,所以我们也提过redis的主从分布.这篇文章主要的就是关注分布式服务器的一些基本思想. 数据库的主从分布:这里我以Mysql为例,当Mysql需要向外扩展的时候的策略则划分为三个部分:复制.拆分以及数据分片 ,而主从分布最主要关注的问题就是主库和从库间的同步.原理如下图: 大致描述一下过程:从服务器的IO线程从主服务器获

Centos6下nginx+keepalived构建高可用web集群

1)拓扑描述: 2) nginx的安装准备 pcre:兼容的正则表达式,nginx也要支持伪静态 # yum -y install pcre pcre-devel # yum -y install openssl* # mkdir -p /application/nginx1.6.2 # ln -s /application/nginx1.6.2 /application/nginx 3) 安装nginx # cd /usr/local/src # tar xf nginx-1.6.2.tar.

构建高可用的LVS负载均衡集群 入门篇

一.LVS简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org.现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能. LVS 集群采用IP负载和基于内容请求分

Centos 7搭建LVS+Keepalived高可用Web服务群集

一.LVS+Keepalived高可用群集 Keepalived的设计目标是构建高可用的LVS负载均衡群集,可以调用ipvsadm工具来创建虚拟服务器.管理服务器池,而不仅仅用作双机热备.使用Keepalived构建LVS群集更加简便易用,主要优势体现在:对LVS负载调度器实现热备切换,提高可用性:对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入. 在基于LVS+Keepalived实现的LVS群集结构中,至少包括两台热备的负载调度器,三台以上的节点服务器.此博客将以DR模式的

heartbeat + httpd + nfs 实现高可用web服务器

一  环境准备 二 拓扑结构 三 前提条件 四 安装相关软件 五 配置heartbeat 六 测试web集群 七 问题汇总 八 共享存储 一 环境准备 操作系统 centos 6.4 x86_64  最小化安装 如使用yum 安装的方式 centos5.5 安装的是V2.X   ,centos 6.4 安装的是V3.X YUM 安装   Vim  man   ntp  "development tools" "server platform development"