缓存+mysql优化.docx
《缓存+mysql优化.docx》由会员分享,可在线阅读,更多相关《缓存+mysql优化.docx(76页珍藏版)》请在冰豆网上搜索。
缓存+mysql优化
目录
一、大型网站的主要参数1
二、大型网站带来的问题2
三、高的并发量如何解决2
四、解决大的流量问题3
1、减少http请求3
2、配置缓存,4
3、配置压缩,减少数据传输的数据量。
8
4、把比较占用流量的一些资源单独部署服务器。
11
五、大存储的解决方案11
1、使用服务器端的缓存技术,目的是减少或不查数据库11
2、数据库方面的优化。
12
六、页面静态化之真静态12
1、页面静态化的分类12
2、实现方式:
12
3、ob缓存的讲解12
4、ob缓存对应的函数,13
5、真静态典型案例:
17
6、真静态案例扩展19
7、TP框架如何使用真静态。
20
8、真静态的优缺点说明:
21
七、页面静态化之伪静态21
1、原理说明:
22
2、开启重写模块。
22
3、完成一个入门案例:
22
4、配置的语法:
24
一、大型网站的主要参数
pv值(pageviews)网站的浏览量
一个网站的所有页面,在一天24小时内被访问的总的次数。
达到千万级别,百万级别。
uv值(uniquevistor)独立访客
一个网站,在一天24小时内,有多少个用户来访问我们的网站。
百万级别,几十万级别以上。
独立ip
一个网站,在一天24小时内,有多少个独立ip来访问我们的网站。
百万级别,几十万级别以上。
如果要考虑局域网,则uv值略大于独立ip的。
二、大型网站带来的问题
高的并发量:
一个网站,在同一时间点(1秒内)有多少人同时访问网站的某一个页面。
500*3600*10=
大的带宽(流量):
流量变大。
数据存储海量级别:
数据表的容量达到,GT级别。
要求,要快速的查找需要的数据。
三、高的并发量如何解决
服务器架构,采用分层架构,采用负载均衡来处理,
负载均衡的策略:
轮询技术:
负载均衡把请求轮流转发给web服务器。
最少连接:
负载均衡把请求转发给最空闲的web服务器。
ip哈希:
同一地址的客户端,始终请求同一台web服务器。
负载均衡器:
硬件:
F5-BiGIP特点:
立竿见影,价格昂贵,一般大型的网游公司,实力比较大的公司再用。
软件:
需要一台普通的服务器只需安装负载均衡软件即可
lvs(linuxviturlserver)集成到内核中。
nginx(该软件可以做web服务器用,也可以做负载均衡用)
四、解决大的流量问题
1、减少http请求
主要手段就是合并(样式文件,背景图片文件,js文件),减少http请求的次数。
效果:
实际上皇冠和喇叭是在同一张图片上。
2、配置缓存,
把一些更新不是很频繁的资源,缓存到浏览器端,当浏览器下次再请求同一资源时,直接从浏览器端取出,就无需请求服务器了。
实现方式:
是通过web服务器配置来实现的。
打开apache的配置文件,httpd.conf,要开启缓存配置模块。
具体配置代码:
#开启缓存的配置
ExpiresActiveOn
#基于文件类型配置缓存的。
ExpiresByTypeimage/jpeg“accessplus30days”
语法格式:
access/now:
基于请求响应一瞬间的。
modification:
基于文件最后修改日期的。
配置案例:
测试文件代码:
配置缓存效果:
可以通过响应头信息来查看文件的类型。
也可以对某些文件不缓存,永远要请求服务器。
需要开启头模块。
在虚拟主机里面配置:
具体的效果:
总的配置代码:
3、配置压缩,减少数据传输的数据量。
查看浏览器支持的压缩格式:
在请求的头信息里面,告诉服务器,我支持哪种压缩格式。
原理:
为了提高网页在网络上的传输速度,服务器对主体信息进行压缩。
如常见的gzip压缩,deflate压缩,compress压缩以及google的chrome正在推的sdcn压缩
Apache上利用gzip压缩算法进行压缩的模块有两种:
mod_gzip和mod_deflate.
Apache1.x系列没有内建网页压缩技术,使用额外的第三方mod_gzip模块。
Apache2.0以上的版本中gzip压缩使用mod_deflate模块。
配置步骤:
(1)要开启gzip压缩的mod_deflate模块。
(2)在虚拟机主机里面进行配置,
要针对那些文件配置压缩,要根据文件类型来具体的配置压缩。
注意:
为什么要指定文件类型来压缩?
压缩也是要耗费cpu资源的,图片/视频等文件,压缩效果也不好。
一般压缩文本格式的文件。
配置的语法:
DeflateCompressionLevel6#压缩级别为6,可选1-9,推荐为6
AddOutputFilterByTypeDEFLATEtext/plain#压缩文本文件
AddOutputFilterByTypeDEFLATEtext/html#压缩html文件
AddOutputFilterByTypeDEFLATEtext/xml#压缩xml文件
压缩级别:
DeflateCompressionLevel指令来设置压缩级别。
该指令的值可为1(压缩速度最快,最低的压缩质量)到9(最慢的压缩速度,压缩率最高)之间的整数,其默认值为6(压缩速度和压缩质量较为平衡的值)
没有压缩之前:
压缩之后的效果:
最终的虚拟机配置代码:
80>
DocumentRoot"D:
/amp/demo"
ServerName
/amp/demo">
OptionsindexesFollowSymLinks
#开启缓存功能
ExpiresActiveOn
#针对jpeg的图片文件设置缓存。
ExpiresByTypeimage/jpeg"accessplus1months"
#ExpiresByTypeimage/gif"accessplus3months"
headersetcache-control"no-store,must-revalidate"
AllowOverrideAll
Orderallow,deny
allowfromall
#压缩级别为6,可选1-9,推荐为6
DeflateCompressionLevel6
#压缩文本文件
AddOutputFilterByTypeDEFLATEtext/plain
#压缩html文件
AddOutputFilterByTypeDEFLATEtext/html
#压缩xml文件
AddOutputFilterByTypeDEFLATEtext/xml
4、把比较占用流量的一些资源单独部署服务器。
打开一个请求分发的目录。
五、大存储的解决方案
1、使用服务器端的缓存技术,目的是减少或不查数据库
(1)页面静态化技术(磁盘缓存)
(2)内存缓存技术(redis/memcache/mysql里面的memeory引擎)
2、数据库方面的优化。
无论如何优化,如何做缓存,总是要操作数据库的,要从数据库的层面来提高访问速度。
六、页面静态化之真静态
1、页面静态化的分类
从形式上来分:
真静态:
把一个动态的页面(操作数据库),生成一个静态页面.html文件。
伪静态:
从表面上来看,是一个静态页面,实际上操作是一个动态页面。
比如如下网站:
伪静态主要是利用seo,防sql注入。
从范围来说:
全部静态:
局部静态(局部动态),比如用户登录状态。
2、实现方式:
真静态:
主要使用ob缓存技术,ob缓存是缓存的响应主体。
伪静态:
利用web服务器的重写机制(rewrite)。
3、ob缓存的讲解
ob就是output_buffering:
输出缓存,在请求一个php的过程中,我们实际上经过三个缓存,ob缓存,程序缓存,浏览器缓存。
最后输出数据。
ob缓存是可以关闭的。
程序缓存是不能关闭,是默认就开启的,用于缓存发送到浏览器端的数据。
如何开启ob缓存:
(1)使用函数ob_start()来开启ob缓存,只针对当前页面起作用。
(2)使用php.ini配置文件来开启ob缓存。
4、ob缓存对应的函数,
ob_start();//开启ob缓存。
ob_get_contents();//获取ob缓存里面的数据
ob_clean();//清除ob缓存里面的数据,并没有关闭ob缓存
ob_end_clean();//清除ob缓存里面的数据,并关闭ob缓存。
ob_flush():
把ob缓存里面的数据给刷新(移动,推送)到程序缓存,并不关闭ob缓存。
如果ob缓存出现了嵌套,则内层ob缓存把数据推送的外层的ob缓存。
ob_end_flush();把ob缓存里面的数据给刷新(移动,推送)到程序缓存,并关闭ob缓存。
如果ob缓存出现了嵌套,则内层ob缓存把数据推送的外层的ob缓存,并关闭内层的ob缓存。
ob缓存是可以嵌套的。
常用的:
ob_start();
//执行代码、取出数据库的数据
$content=ob_get_contents();
//生成静态页面。
file_put_contents($filename,$contents);
5、真静态典型案例:
(1)完成新闻列表页面:
newslist.php页面
(2)完成新闻详情页面newsinfo.php页面。
6、真静态案例扩展
在以上案例中,当数据库里面的数据内容变化了,还是读取的原来生成的静态页面,我们要要重新生成静态页面。
思路:
给生成的静态页面一个缓存周期,比如是5分钟,5分钟过后,则重新生成静态页面。
如果一个网站并发量是500,5分钟内操作了数据库500*300=15万次。
如果做了静态化,5分钟内操作数据库1次。
如何判断页面在缓存有效期内:
思路:
文件的最后修改时间+缓存有效期》当前的时间戳
16:
16分:
缓存5分钟16:
22
该条件就表示每隔5分钟重新生成静态页面。
7、TP框架如何使用真静态。
(1)在总的配置文件里面,开启静态缓存;
(2)在需要生成真静态的模块中,添加生成静态页面的配置。
缓存时间,过了缓存时间要重新生成。
生成静态页面的名称
哪个控制器中的哪个方法,要生成静态页面。
生成的静态页面:
8、真静态的优缺点说明:
优点:
(1)速度快
(2)安全性高(3)利于seo
缺点:
就是占有磁盘空间.,如果过大,对磁盘响应速度有影响
在什么情况下,建议不要使用真静态
(1)页面的数据更新频繁,最好不要使用真静态(比如股票,基金,等实时报价系统)
(2)会生成海量页面(比如大型论坛bbs,csdn)
(3)查询该页面一次后,以后再也不查询该页面.
(4)不愿意被搜索引擎抓取的页面.
(5)访问量小的页面.
七、页面静态化之伪静态
伪静态:
把一个动态的地址伪装成一个静态的地址
实现方式:
利用web服务器的rewrite机制。
rewrite机制:
将一个请求URL重写到另一个请求上!
比如:
index.html重写成index.php
abc.php重写成123.php
news_sport_id12.html重写成news.php?
type=sport&id=12
1、原理说明:
2、开启重写模块。
打开apache的配置文件。
3、完成一个入门案例:
当请求index.html页面,重写成index.php页面。
使用分布式配置文件来完成配置,在根目录下面通过编辑器另存为的方式新建一个.htaccess文件。
要使用.htaccess文件,则要保证虚拟主机里面的配置。
AllowOverride配置项为All
为All则启用.htaccess的配置。
4、配置的语法:
#重写引擎开关
RewriteEngineon
#定义重写发生的条件
RewriteCond意思是:
满足什么条件才可以重写。
#配置重写规则
RewriteRuleindex.htmlindex.php
具体的语法:
(1)RewriteCond的语法:
RewriteCond判断依据条件表达式[条件标志]
判断依据:
可以是服务器变量:
条件表达式:
-f表示是一个文件
-d表示是一个目录
条件标志:
[NC]不区分大小写,
[OR]默认条件之间的关系是and,使用该标志表示和前面的条件是或的关系。
案例:
如果访问的文件存在,则访问该文件,若不存在,则执行重写
配置的代码:
(2)RewriteRule的语法:
语法:
RewriteRule请求的url目标url
请求的url可以使用正则完成匹配。
案例:
使用新闻列表完成伪静态
请求的url:
newsinfo-id1.html重写成newsinfo.php?
id=1
使用正则匹配
newsinfo-id(\d).htmlnewsinfo.php?
id=$1
$1是前面(\d)的内容。
配置代码:
效果:
目录
一、内容回顾1
二、mysql优化概述2
三、存储引擎的选择2
1、innodb存储引擎;2
2、myisam存储引擎3
3、memory4
四、查找需要优化的sql语句。
4
1、慢查询日志4
2、使用mysql的profiles机制,7
五、索引的讲解7
1、索引的分类:
8
2、创建索引的语法:
8
3、查看索引9
4、删除索引9
5、创建索引的注意事项10
六、索引的数据结构11
七、explain(执行计划)工具使用12
八、索引的使用细节16
1、多列索引(复合索引)16
2、对于使用like的查询,查询如果是”%aaa”,不会使用到索引,‘aaa%’会使用到索引。
18
3、如果条件中有or,则要求or的索引字段都必须有索引,否则不能用到索引。
18
4、如果列类型是字符串,一定要在条件中将数据使用引号引用起来,否则不使用索引。
20
5、优化groupby语句。
20
6、当取出的数据量超过表中数据的20%,优化器就不会使用索引,而是全表扫描。
22
7、查看索引的使用情况showstatuslike‘Handler_read%’;大家可以注意:
handler_read_key:
利用索引获得纪录的次数。
22
九、索引覆盖23
十、前缀索引24
一、内容回顾
ob_star()
ob_get_contents();
file_put_contents();
二、mysql优化概述
前面我们讲页面静态化,memcache是通过减少对mysql操作来提升访问速度,但是一个网站总是要操作数据库,我们如何提升对mysql的操作速度。
方针:
设计角度:
存储引擎的选择,字段类型选择,范式。
利用mysql自身的特性:
索引,查询缓存,分区分表,存储过程,sql语句的优化
部署大负载架构体系:
主从复制(读写分离)
三、存储引擎的选择
存储引擎是什么?
是数据库的文件系统,是mysql数据库服务器存储数据的数据结构,处于最底层的状态。
1、innodb存储引擎;
从mysql5.5.x开始,默认的存储引擎变更为innodb引擎,支持事务ACID属性(原子性一致性,隔离性,持久性),是为处理巨大数据量时拥有最大性能而设计的。
它的cpu效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
数据存储方式:
表结构,单独是一个文件,文件名为table.frm
表数据和表的索引是存储到data目录下面的ibdata1里面的。
数据记录的存储是按照主键顺序插入的。
createtablet1(
idintprimarykey,
namevarchar(32)
)engineinnodbcharsetutf8;
insertintot1values(4,'xiaogang'),(2,'xiaolong'),(1,'dagang'),(3,'xiaofeng');
当有大量数据插入时,会变慢,会影响插入效率,因为是按照主键顺序插入,要有一个排序的过程。
并发性:
实现了行锁,擅长并发处理,不会影响其他行的操作。
数据完整性
支持事务ACID属性(原子性一致性,隔离性,持久性),
2、myisam存储引擎
ISAM:
索引序列管理方法
是indexedsequentialaccessmethod(索引顺序存取方法)的缩写优势,在索引的处理上索引独立存储。
数据存储方式
表结构、表数据、表索引是分别来存储的。
创建一个myisam引擎的表后,会形成三个文件。
数据记录的存储是按照插入顺序存储的。
createtablet2(
idintprimarykey,
namevarchar(32)
)enginemyisamcharsetutf8;
insertintot2values(4,'xiaogang'),(2,'xiaolong'),(1,'dagang'),(3,'xiaofeng');
并发性:
实现的表锁,不擅长并发处理,锁定整张表后,会影响其他的进程操作该表。
支持全文索引
在最新的mysql5.6以后,innodb引擎也支持全文索引了。
3、memory
一些访问频繁,变化频繁,又没有必要入库的数据,比如用户在线状态
memory(数据是存储到内存里面的,重启mysql服务会丢失)如果没有memcached或者redis,但是数据操作频繁,可以考虑使用memory存储引擎,比如好友在线状态。
适合做高速缓存。
查看存储引擎:
showengines;
四、查找需要优化的sql语句。
要对,执行速度比较慢的sql语句进行优化,如何查找执行速度比较慢的sql语句呢?
1、慢查询日志
是一种mysql提供的日志,记录所有执行时间超过某个时间界限的sql的语句。
这个时间界限,我们可以指定。
在mysql中默认没有开启慢查询,即使开启了,只会记录执行的sql语句超过10秒的语句。
开启慢查询日志:
在配置文件中my.ini文件,
指定时间界限
指定慢查询日志的文件名称
该慢查询日志存储的位置是:
默认是和数据表同一个目录里面。
在data目录里面会看到生成的慢查询日志文件。
使用命令查看慢查询日志的时间界限:
showvariableslike‘long_query_time’
也可以通过命令,在当前会话下重新设置慢查询日志的时间界限。
setlong_query_time=1;
测试慢查询日志:
使用benchmark(count,expr)函数可以测试执行count次expr操作需要的时间。
打开慢查询日志的文件进行查看:
2、使用mysql的profiles机制,
该机制精确的记录执行sql语句的时间,精确到小数点后8位。
开启profile机制
执行setprofiling=1
使用showprofiles查看sql语句的执行时间;
关闭profiles机制
setprofiling=0,如果不需要查找执行的慢的sql语句,要关闭该机制。
一般情况下,一个sql语句执行速度比较慢原因是没有添加索引。
添加索引之后
添加索引之前
五、索引的讲解
索引就是,利用关键字的某些特性,快速定位数据的一种技术。
1、索引的分类:
普通索引:
利用特定的关键字,标识数据记录的位置(磁盘上的位置,盘号,柱面,扇面,磁道)。
唯一索引:
限制索引的关键字不能重复的索引,数据字段内容可以为null,一个表中可以有多个唯一索引。
主键索引:
限制索引的关键字不能重复,并且不能为NULL。
(不能为NULL的唯一索引)。
一个表中只允许有一个主索引。
全文索引:
索引的关键字,不是某个字段的值,而是字段值中有意义的词来作为关键字建立索引。
复合索引,如果一个索引(以上四种任何都可以),是依赖于多个字段创建的化,称之为复合索引。
2、创建索引的语法:
(1)是在创建表时,直接创建索引。
createtableindex1(
idintauto_incrementcomment'主键索引',
namevarchar(32)comment'唯一索引',
ageintcomment'普通索引',
introvarchar(256)comment'全文索引',
primarykey(id),
uniquekey(name),
index(age),
fulltextindex(intro)
)enginemyisamcharsetutf8;
(2)在创建表完成后,再修改表结构创建索引。
3、查看索引
showindexfromtable_name;
showindexesfromtable_name
desctable_name
showcreatetable_name
4、删除索引
删除主键索引
altertabletable_namedropprimarykey;
在主键索引时,如果有auto_increment属性,则不能直接删除主键索引的,要先删除auto_increment属性,再删除主键索引。
删除非主键索引;
altertabletable_namedropindex索引名称
5、创建索引的注意事项
(1)较频繁的作为查询条件字段应该创建索引
select*fromempwhereempno=1
(2)唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
select*fromempwheresex='男‘
(3)更新非常频繁的字段不适合创建索引
select*fromempwherelogincount=1
(4)不会出现在WHERE子句中字段不该创建索
六、索引的数据结构
1、myisam引擎的索引的数据结构。
索引的节点中存储的是数据的物理地址(磁道和扇区)
在查找数据时,查找