内存不足导致sql执行过慢

编    写:袁    亮
时    间:2014-05-08
说    明:内存不足导致sql执行过慢

一、问题描述
1、某条sql执行了37秒
2、看慢日志里,被锁的时间在万分之几秒,因此不是因为被锁从而导致执行慢

二、问题分析
1、经与其他人沟通,可能是因为内存不足,导致索引没有加载到内存里,所以比较慢
mysql的所有会部分加载到内存里,如果内存不足的时候,会根据一定的策略将部分数据去除,重新读入数据到内存中
该内存大小设置可通过:show variables like '%key%';
然后设置set global key_buffer_size=2048000000;(2G)将该值改大
2、另外一种可能是在那个时间点,磁盘io有问题,从而导致读取数据变慢
但是如果是磁盘io卡住的话,那么那个时间点的其他sql应该也会卡,而看慢日志里,附近时间点并没有其他的慢查询
查看那个时间点的io,正常

三、总结
1、mysql启动或者重启的时候,因为要把索引加载到内存中,刚重启的时候,可能会导致服务器的io等负载过高,重启就挂
2、mysql一般来说,不能直接关,关掉之后,会需要修复表
3、有些时候,会执行的很慢,很有可能就是内存给的不够,一般4个G,机器较好的话,可以给4G

关于mysql截断内容问题

袁亮,2014-03-14,关于mysql截断内容问题解决

 

  • 问题描述:
  • 当用户发表有某些特殊字符的内容时,存入mysql数据库的内容会被截断

2、数据库、程序文件等都是utf-8编码

3、确认sql正常

 

  • 原因:
  • mysql中utf8编码最多只能是3个字节(5.3版本后,有utf8mb4类型可支持4个字节的utf8)
  • utf8是一种1-4个字节的可变字符编码(英文1个字符,汉字3个字符)
  • 某些特殊字符(emoji表情符号等)是4字节的utf8编码
  • Mysql在遇到超过最大字节范围的字符时,会忽略其后面的字符串,从而导致内容丢失

 

  • 解决思路:
  • 升级mysql到5.3版本以上,并将字段的编码设置为utf8mb4类型
  • 通过程序,将字符串中4字节的utf8字符替换或者删除即可

 

  • 剔除utf8字符串中4字节的字符方法:

[code]

function removeByte4($str){

return preg_replace('/[\xF0-\xF7].../s','', $str);

}

[/code]

性能:台式机,4.6W字符,0.006s,对程序性能影响基本可以忽略

 

附:(其他的一些相关知识)

 

  • Utf8 4字节各系统的支持情况:

1、windows xp: xp系统不支持4字节utf8字符, 浏览器用占位符显示

2、windows 7: 支持4字节utf8字符

3、mac os x: 支持4字节utf8字符

4、iPhone/iPad: 支持4字节utf8字符

 

1、将特殊的4字节字符用相应的图片表情代替

2、替换的时候,注意不要堵塞用户的处理流程,当文本内容较长时,这是一个很耗性能的处理,建议先忽略4字节字符,然后将内容存到文件或者其他地方,后续使用脚本对这些内容进行替换处理等操作。

3、新浪微博等有做相应处理

4、特殊符合以及对应表情可参考网站:http://www.charbase.com/

  • 四种不同剔除utf8字符串中4字节字符的性能比对:

测试机:普通pc 测试文本:4.6W字节的中英文、特殊字符等混合

  • 极快,推荐使用:006s

function removeByte4($str){

return preg_replace('/[\xF0-\xF7].../s','', $str);

}

 

  • 较慢,参考用:2s

function removeByte4_2($str){

return preg_replace('/[\x{10000}-\x{10FFFF}]/u','', $str);

}

  • 慢,但方便对特殊字符做不同替换:3s

function removeByte4_1($str){//移除utf-8编码中4字节及以上的字符

mb_internal_encoding("UTF-8");

$len = mb_strlen($str);

$res = '';

for($i=0;$i<$len;$i++){

$t = mb_substr($str,$i,1);

$res .= strlen($t)<=3?$t:'';

}

return $res;

}

  • 极慢,不具使用价值,仅参考:9s

function remove_4_byte($string) {

$char_array = preg_split('/(?<!^)(?!$)/u', $string );

$len = count($char_array);

for($x=0;$x<$len;$x++) {

if(strlen($char_array[$x])>3) {

$char_array[$x] = "";

}

}

return implode($char_array, "");

}

svn常用命令

ps:从贾荣同学那拿过来的,大家可以参考下

1.svn checkout path(path是服务器上的目录)

例如:svn checkout svn://192.168.1.1/pro/domain

简写:svn co

2、Linux命令行下往版本库中添加新的文件

svn add file

例如:svn add test.php(添加test.php)

svn add *.php(添加当前目录下所有的php文件)

3、Linux命令行下将改动的文件提交到版本库

svn commit -m “LogMessage“ [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关)

例如:svn commit -m “add test file for my test“ test.php

简写:svn ci

4、Linux命令行下的加锁/解锁

svn lock -m “LockMessage“ [--force] PATH

例如:svn lock -m “lock test file“ test.php

svn unlock PATH

5、Linux命令行下更新到某个版本

svn update -r m path

例如:

svn update如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。

svn update -r 200 test.php(将版本库中的文件test.php还原到版本200)

svn update test.php(更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件,然后清除svn resolved,最后再提交commit)

简写:svn up

6、Linux命令行下查看文件或者目录状态

1)svn status path(目录下的文件和子目录的状态,正常状态不显示)

【?:不在svn的控制中;M:内容被修改;C:发生冲突;A:预定加入到版本库;K:被锁定】

2)svn status -v path(显示文件和子目录状态)

第一列保持相同,第二列显示工作版本号,第三和第四列显示最后一次修改的版本号和修改人。

注:svn status、svn diff和 svn revert这三条命令在没有网络的情况下也可以执行的,原因是svn在本地的.svn中保留了本地版本的原始拷贝。

简写:svn st

7、Linux命令行下删除文件

svn delete path -m “delete test fle“

例如:svn delete svn://192.168.1.1/pro/domain/test.php -m “delete test file”

或者直接svn delete test.php 然后再svn ci -m ‘delete test file‘,推荐使用这种

简写:svn (del, remove, rm)

8、Linux命令行下查看日志

svn log path

例如:svn log test.php 显示这个文件的所有修改记录,及其版本号的变化

9、Linux命令行下查看文件详细信息

svn info path

例如:svn info test.php

10、Linux命令行下比较差异

svn diff path(将修改的文件与基础版本比较)

例如:svn diff test.php

svn diff -r m:n path(对版本m和版本n比较差异)

例如:svn diff -r 200:201 test.php

简写:svn di

11、Linux命令行下将两个版本之间的差异合并到当前文件

svn merge -r m:n path

例如:svn merge -r 200:205 test.php(将版本200与205之间的差异合并到当前文件,但是一般都会产生冲突,需要处理一下)

12、Linux命令行下SVN 帮助

svn help

svn help ci

以上是常用命令,下面写几个不经常用的

13、Linux命令行下版本库下的文件和目录列表

svn list path

显示path目录下的所有属于版本库的文件和目录

简写:svn ls

14、Linux命令行下创建纳入版本控制下的新目录

svn mkdir: 创建纳入版本控制下的新目录。

用法: 1、mkdir PATH…

2、mkdir URL…

创建版本控制的目录。

1、每一个以工作副本 PATH 指定的目录,都会创建在本地端,并且加入新增调度,以待下一次的提交。

2、每个以URL指定的目录,都会透过立即提交于仓库中创建.在这两个情况下,所有的中间目录都必须事先存在。

15、Linux命令行下恢复本地修改

svn revert: 恢复原始未改变的工作副本文件 (恢复大部份的本地修改)。revert:

用法: revert PATH…

注意: 本子命令不会存取网络,并且会解除冲突的状况。但是它不会恢复被删除的目录

16、Linux命令行下代码库URL变更

svn switch (sw): 更新工作副本至不同的URL。

用法: 1、switch URL [PATH]

2、switch –relocate FROM TO [PATH...]

1、更新你的工作副本,映射到一个新的URL,其行为跟“svn update”很像,也会将服务器上文件与本地文件合并。这是将工作副本对应到同一仓库中某个分支或者标记的方法。

2、改写工作副本的URL元数据,以反映单纯的URL上的改变。当仓库的根URL变动(比如方案名或是主机名称变动),但是工作副本仍旧对映到同一仓库的同一目录时使用这个命令更新工作副本与仓库的对应关系。

17、Linux命令行下解决冲突

svn resolved: 移除工作副本的目录或文件的“冲突”状态。

用法: resolved PATH…

注意: 本子命令不会依语法来解决冲突或是移除冲突标记;它只是移除冲突的相关文件,然后让 PATH 可以再次提交。

18、Linux命令行下输出指定文件或URL的内容。

svn cat 目标[@版本]…如果指定了版本,将从指定的版本开始查找。

svn cat -r PREV filename > filename (PREV 是上一版本,也可以写具体版本号,这样输出结果是可以提交的)返回比特网首页>>

svn的服务端搭建及使用

编    写:袁    亮
时    间:2015-01-27
说    明:svn的服务端搭建及使用

一、服务端搭建
1、svn 安装
yum install -y subversion
2、创建svn版本库
mkdir /opt/ci123/svnroot/
3、创建一个svn项目
svnadmin create /opt/ci123/svnroot/test
4、修改svn配置信息
4.1 添加账号:
vim /opt/ci123/svnroot/test/conf/passwd
root=249
4.2 账号权限
vim /opt/ci123/svnroot/test/conf/authz
[/]
root=rw
4.3 svn服务配置
vim /opt/ci123/svnroot/test/conf/svnserve.conf
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
5、启动svn服务
svnserve -d -r /opt/ci123/svnroot/ --log-file /tmp/svn_run.log
注意启动的目录是/opt/ci123/svnroot/
日志写入到/tmp/svn_run.log,方便后期定位问题
6、客户端使用
svn co svn://192.168.0.249:3690/test
#端口号3690可以不写,默认就是这个
7、再建另外一个svn
7.1 使用:svn://192.168.0.249:3690/ciphoto
7.2 创建服务端:
svnadmin create /opt/ci123/svnroot/ciphoto
同上,修改配置信息即可
8、删除一个svn目录
rm -rf /opt/ci123/svnroot/test
慎用,不可恢复

二、shell统一管理
1、配置文件统一
cp -r /opt/ci123/svnroot/ciphoto/conf /opt/ci123/svnroot/conf2
将其中的svnserve.conf引用的passwd和auth文件引用备份出来的配置文件
2、编写创建svn的shell脚本create.sh
#!/bin/sh
#袁亮,2015-01-27
#svn创建脚本

if [ ! "$1" ] ;then #项目名不能为空
echo '请输入你需要创建的svn名'
exit
fi

if [ -d "/opt/ci123/svnroot/$1" ];then
echo '该svn已经存在,请重新输入名称'
exit
fi

echo $1"的svn正在创建中"
res=`svnadmin create /opt/ci123/svnroot/$1`
cp /opt/ci123/svnroot/conf/svnserve.conf /opt/ci123/svnroot/$1/conf/svnserve.conf
echo $1"的svn创建完成,可以通过svn://192.168.0.249/$1 checkout下来访问"
3、执行方法
sh /opt/ci123/svnroot/create.sh test

三、后台管理形式
1、有开源的项目可以直接管理(不好用)
2、也可以自己定制开发,开发也简单

四、配置文件
1、auth文件中组设定
[groups]
geek=yuanliang,root
2、auth文件中给组权限
[/]
@geek=rw
3、所有账号都有读权限
[/]
*=r

附:
1、参考文档:
http://www.cnblogs.com/Anders888/p/4167389.html
http://www.2cto.com/os/201403/282669.html

培训5(3):吉姆工场练习


编	写:袁	亮
时	间:2015-07-06
说	明:吉姆工场功能点

一、功能点
	1、教学中心
		增删改查:省、市、地址,名称,电话,图片
		前台展示
	2、课程管理
		分类
		增删改查:名称,图片,简介,详情
		前台展示
		预约课程
	3、预约功能
		哪个城市,哪个中心
		宝宝名字,家长手机,宝宝生日,知晓渠道
		后台查看,处理
	4、新闻与活动
		分类:新闻、活动
		后台添加cms:标题,内容
		前台展示
	5、加盟合作
		静态展示
		在线申请
		后台查看,操作
	6、视频中心
		分类:品牌、课堂
		后台管理:标题、介绍、截图、视频
		前台展示
	7、首页内容管理
		推荐or自动提取
	8、教师中心,discuz论坛

二、数据字典
	
	
三、练习阶段划分

培训5(2):购物支付


袁亮,2014-06-30

一、需求说明
	1、后台商品管理(添加、列表显示、编辑)
	2、前台商品列表,商品详情页展示
	3、加入购物车功能
	4、生成订单
	5、支付结算
	6、后台订单管理

二、数据字典
	commoditys:(商品表)(型号,备注)
		id:主键id(商品id)
		name:商品名称
		types:状态(1:正常,2:下架)
		total_num:总数(编辑的时候只能增加或者减少多少个,不能直接修改总数)
		sale_num:已购买数量
		last_num:剩余数量
		market_price:市场价格
		buy_price:采购价格
		#show_price:显示价格
		real_price:实际价格
		desc:描述(给用户看)
		mark:备注(购买链接等,内部人员查看)
		update_dated:最后修改时间
		dated:时间

	orders:(订单信息)
		id:主键id(订单号)
		name:订单名称
		user_id:用户id
		comm_id:商品id
		types:订单状态(0:待付款,1:待发货,2:待收货,3:已收货,4:已取消)
		org_price:初始交易价格,不可改
		real_price:实际交易价格,可后台修改
		num:商品个数
		ip:ip地址
		kuaidi_company:快递公司
		kuaidi_num:快递单号
		ord_dated:下单时间
		update_dated:最后更改时间
		dated:订单日期
		
	recvaddress:(订单收货信息)
		id:主键id
		ord_id:订单id
		user_id:用户id
		province:省份
		city:城市
		area:区县
		street:街道
		postcode:邮编
		recvname:收货人
		mobile:手机号
		tel:电话号码
		dated:时间
		
	pay_logs:(付款记录)
		id:主键id
		ord_id:订单号
		trade_no:支付宝交易号
		result:支付结果及交易状态,只有success一个值
		ip:ip地址
		pay_dated:支付时间
		dated:记录时间

三、时间节点
	1、商品管理 1天
	2、前台商品列表、详情页,加入购物车 1天
	3、生成订单	1天
	4、支付		半天
	5、订单管理	1天半

培训5:完整版bbs


袁亮,2014-06-30

一、论坛需求(删减版)(4天):
	1、论坛分为不同板块
	2、发帖、回帖、修改帖子、删除帖子
	3、可以对帖子和回帖进行删除、编辑
	4、可以查看昨天、三天内的帖子
	5、可以对帖子进行结贴(之后该贴不能回复)
	6、全站最热帖子显示,例如今天或者三天内的
	7、帖子置顶

	数据字典:
	categorys:论坛板块
		id:主键
		name:版块名称
		post_num:该版块下文章数量
		dated:时间
	posts:帖子信息
		id:主键
		cate_id:版块id
		title:帖子标题
		reply_num:回复数
		ip:ip地址
		topdated:置顶时间
		is_ban:是否结贴
		update_dated:最后修改时间
		dated:发帖时间
	post_contents:帖子内容
		id:主键
		post_id:帖子id
		content:帖子内容
		dated:时间
	replys:回帖信息
		id:主键
		post_id:帖子id
		content:回复内容
		ip:ip地址
		dated:回复时间

五、后台管理系统(2天)
	1、用户列表[用户信息显示,发贴数,回帖数,注册时间||删除,禁言(发贴|回帖),封IP||点击用户昵称跳到用户的所有发帖页列表]
	2、发帖列表[二级目录按版块分,默认显示全部][点标题到前台页面,帖子信息,发帖人显示||删除帖子,设置置顶]
	3、回帖列表[回帖信息、回帖用户以及原文链接]
	4、版块管理[添加,编辑,删除]
	数据字典:
	categorys:论坛板块
		id:主键
		name:版块名称
		post_num:该版块下文章数量
		dated:时间
	posts:帖子信息
		id:主键
		user_id:哪个用户
		cate_id:版块id
		title:帖子标题
		reply_num:回复数
		ip:ip地址
		topdated:置顶时间
		is_ban:是否结贴
		update_dated:最后修改时间
		dated:发帖时间
	post_contents:帖子内容
		id:主键
		post_id:帖子id
		content:帖子内容
		dated:时间
	replys:回帖信息
		id:主键
		user_id:哪个用户
		post_id:帖子id
		content:回复内容
		ip:ip地址
		dated:回复时间
	users:(用户信息表)
		id:主键,用户id
		username:用户名,唯一标示
		password:密码,md5之后存储,不允许明码
		nickname:昵称
		head:头像地址
		email:用户邮箱
		birthday:用户生日
		sex:用户性别
		last_dated:最后一次登录
		is_admin:是否管理员
		dated:注册时间
	ban_ips:(被禁言的IP,前台发帖、回复前需要验证)
		id:主键
		ip:用户ip
		dated:时间

二、整体进度
	1、发帖,帖子列表页 第一天(版块直接在数据库中插入修改)
	2、回帖、结贴、回复列表页 第二天
	3、分页、以及列表页不同选择显示、帖子置顶 第三天
	4、删贴、修改帖子第四天及总结
	5、后台 版块管理 用户列表及功能 第五天
	6、后台 发帖、回帖列表及功能 第六天

培训4:简易bbs


袁亮,2014-06-30

一、论坛需求(删减版)(4天):
	1、论坛分为不同板块
	2、发帖、回帖、修改帖子、删除帖子
	3、可以对帖子和回帖进行删除、编辑
	4、可以查看昨天、三天内的帖子
	5、可以对帖子进行结贴(之后该贴不能回复)
	6、全站最热帖子显示,例如今天或者三天内的
	7、帖子置顶

	数据字典:
	categorys:论坛板块
		id:主键
		name:版块名称
		post_num:该版块下文章数量
		dated:时间
	posts:帖子信息
		id:主键
		cate_id:版块id
		title:帖子标题
		reply_num:回复数
		ip:ip地址
		topdated:置顶时间
		is_ban:是否结贴
		update_dated:最后修改时间
		dated:发帖时间
	post_contents:帖子内容
		id:主键
		post_id:帖子id
		content:帖子内容
		dated:时间
	replys:回帖信息
		id:主键
		post_id:帖子id
		content:回复内容
		ip:ip地址
		dated:回复时间
二、整体进度
	1、发帖,帖子列表页 第一天(版块直接在数据库中插入修改)
	2、回帖、结贴、回复列表页 第二天
	3、分页、以及列表页不同选择显示、帖子置顶 第三天
	4、删贴、修改帖子第四天及总结

培训3:注册登陆


袁亮,2014-06-30

一、注册登录(1.5天)
	1、实现用户注册系统
		用户名,昵称等符合常用注册要求
		所有判断先用js进行判断,再进行PHP判断,详细要求请参考其他网站登录页面
	2、实现登录功能,登录判断必须有经过加密解密
		正常登录以及记住登录功能
		记住登陆指的是用户重启浏览器之后,还是登陆状态
	3、退出登录功能

	数据字典:
	users:(用户信息表)
		id:主键,用户id
		username:用户名,唯一标示
		password:密码,md5之后存储,不允许明码
		nickname:昵称
		head:头像地址
		email:用户邮箱
		birthday:用户生日
		sex:用户性别
		last_dated:最后一次登录
		is_admin:是否管理员
		dated:注册时间

二、项目规范
	1、文件夹命名
	2、文件命名
	3、常用文件夹
	4、mysql 增、删、改、查功能
	5、phpmyadmin熟悉
	6、mysql常用字段类型