php相关总结2

MYSQL相关知识
1)如何分库分表
分表是分散数据库压力的好方法。
分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库
当然,首先要知道什么情况下,才需要分表。个人觉得单表记录条数达到百万到千万级别时就要使用分表了。
1)分表的分类
1)纵向分表
将本来可以同一个表的内容,人为划分为多个表(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的)
分表理由:根据数据库的活跃度进行分离。(因为不同活跃度的数据,处理方式是不同)

案例:
对于一个博客系统,文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且有很好的实时性数据,我们把它叫做冷
数据,而博客的浏览量,回复等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据,所以,在进行数据
库结构设计的时候,就应该考虑分表,首先是纵向分表处理。
这样纵向分表后:
首先储存引擎的适用不同,冷数据适用MyIsam可以有更好的查询数据,活跃数据,可以适用Innodb,可以有更好的更新速度
其次,对冷数据进行更多的从库配置,因为更多的操作时查询,这样来加快查询速度.对热数据,可以相对有更多的主库的横向
分表处理。
其实,对于一些特殊的活跃数据,也可以考虑使用memcache,redis之类的缓存,等累计到一定量再去更新数据库,或者mongodb一
类的nosql数据库,这里只是举例,就先不说这个。
2)横向分表
字面意思,就可以看出来,是把大的表结构,横向切割为同样结构的不同表,如,用户信息表,user_1,user_2等。表结构是完全一样,但是,根据某些特定的规则来划分的表,如根据用户ID来取模划分。分表理由:根据数据量的规模来划分,保证单标的内容不会太大,从而来保证单标的查询等处理能力.

案例:
同上面的例子,博客系统。当博客的量达到很大时候,就应该采取横向分割来降低每个单表的压力,来提升性能.例如博客的冷数据表
例如分为100个表,当同时有100万个用户在浏览,如果是单表的话,会进行100万次请求,而现在分表后,就可能是每个表进行1万个数据的请求(
因为,不可能绝对的平均,只是假设),这样压力就降低了很多。
2)数据表类型有哪些
MYISAM、InnoDB、HEAP、BOB/ARCHIVE/CSV等
MYISAM: 成熟,稳定,易于管理,快速读取。一些功能不支持(事务等),表级琐。
InnoDB: 支持事务,外键等特性,数据行锁定.空间占用大,不支持全文索引等。

3)防sql注入方法
mysql_escape_string( ($arr["$val"]));

函数:
/*函数名称: post_check()
*函数作用:对提交的编辑内容进行处理
*参数:$post要提交的内容
*返回值:$post返回过滤后的内容
*/
function post_check($post){
if(!get_magic_quotes_goc()){//判断magic_quotes_gpc是否打开
$post = addslashes($post);//进行magic_quotes_gpc没有打开的情况对提交数据的过滤
}
$post = str_replace("_","\_",$post);//把'_'过滤掉
$post = str_replace("%","\%",$post);//把'%'过滤掉
$post = nl2br($post);//回车转换
$post = htmlspecialchars($post);//html标记转换
return $post;
}
4)mysql把一个大表拆分多个表后,如何解决跨表查询效率问题
如果你切分了10张表,需要做一个归并查询(union),即查询10张表里的数据再合并返回。
5)索引应用
什么情况下考虑索引
什么情况不适合索引
一个语句是否用到索引如何判断

经常发生的用不到索引场景:
like '%...'
数据类型隐式转换
or 关键字加其它条件约束
全文索引:
只能用于MYISAM表,在CHAR,VARCHAR,TEXT类型的列上创建
6)mysql对于大表(千万级),要怎么优化呢?
很多人第一反应就是各种切分;我给的顺序是:
1)第一优化你的sql语句和索引
2)第二加缓存,memcached,redis
3)第三以上都做了之后,还是慢,就做主从复制或主主复制,读写分离,可以在应用层做,效率高,也可以用第三方工具
第三方工具推荐360的atlas,其他的效率要么不高,要么没人维护
4)如果上述都做了还是慢,不要想着去做切分,mysql自带分区表,先试试这个,对你的应用是透明的,无需更改代码,但是
sql语句是需要针对分区表做优化的,sql条件中要带上分区条件的列,从而使查询定位到少量的分区上,否则就会扫描全部分区。
5)如果以上都做了,那就先做垂直拆分,其实就是根据你的模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统。
6)第六才是水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key,为了有好的慢查询效率,
表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表。
7)关于用户登录状态存session,cookie还是数据库或者memcache的优劣
1)session中保存登录状态
优:整个应用可以从session中获取用户信息,并且查询时很方便,在session中保存用户信息是不可缺少的(web应用中)
缺:session中不宜保存大量信息,会增减内存消耗量
2)cookie中保存登录状态
优:数据保存在客户端,方便用户下次登录,如:'记住我'功能
缺:安全性不高,一般都是将数据加密后保存在cookie中
3)memcache应用主要体现在对大量数据的cache,如:将经常用到的数据保存在memcache中,减少对数据库的访问次数,在web应用中也是不可缺少的。
缺:当cache爆掉后,造成数据丢失
从效率考虑:cookie>memcache>数据库
cookie对服务器端负载没影响,如果加密、解密会多消耗一点点cpu,同域名下的所有http request header都会附带cookie,所以在大流量下,把js、css、图片放到另外一个域名下会节约
掉这部分流量。
memcache会占用一些服务器内存。
数据库连接本地就是典型的瓶颈,能免则免。
从服务器可扩展性可扩展性考虑:
如果有很多台后端服务器,就需要共享session数据
memcache、数据库都可以做到在多台服务器之间共享session,但是容易形成单点瓶颈,大负载下需要考虑储存路由之类
cookie完全不需要再服务器端共享session数据,与REST无状态风格暗合
8)sql语言分4大类请列举
DDL(data definition language) -- CREATE,DROP,ALTER   数据定义语言,用于定义和管理sql数据库中的所有对象的语言
DML(data manipulation language statements) -- INSERT,UPDATE,DELETE  数据库操作语言,sql中处理数据库等操作统称为数据操纵语言
DQL -- SELECT
DCL(data control language) -- GRANT,REMOVE,COMMIT,ROLLBACK 数据控制语言,用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间
及效果,对数据库实行监视等。

php高级
1)长连接和短连接的使用
tcp/ip是个协议组,可分为三个层次:网络层,传输层,应用层。
在网络层有ip协议、icmp协议、arp协议、rarp协议、bootp协议
在传输层中有tcp协议与udp协议
在应用层有:tcp包括ftp、ftp、telent、smtp等协议
udp包括dns,tftp等协议
短连接
连接->传输数据->关闭连接
HTTP是无状态的,浏览器和服务器每进行一次http操作,就建立一次连接,但任务结束就中断连接。
也可以这样说:短连接时指socket连接后发送后接受完数据马上断开连接。

长连接
连接->传输数据->保持连接->传输数据->...->关闭连接
长连接指建立socket连接后不管是否使用都保持连接,但安全性较差

http的长连接
http也可以建立长连接的,使用connection:keep-alive,HTTP 1.1默认进行持久连接,HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持

什么时候用长连接,短连接?
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,每个tcp连接都需要三步握手,这需要时间,如果每个操作都是先连接,
再操作的话那么处理数据会降低很多,所以每个操作完成之后都不断开,下次处理的时候直接发送数据就行了,不用建立tpc连接。例如:
数据库的连接就是用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket创建也是对资源的浪费。
而像web网站的http服务一般都用短连接,因为长连接对于服务端来说会耗费一定的资源,而像web网站这么频繁的成千上万甚至上亿客户端
的连接会用短连接更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知,所以并发量大,但每个用户无需
频繁操作情况下需要短连接好。

猜你喜欢

转载自blog.csdn.net/a369405354/article/details/79386875
今日推荐