Monthly Archives: June 2014

通过多磁盘提高数据库读写性能

一个disk controller挂接多个disk,可以增加数据读写性能。具体两种方案:

1. 不同disk放不同数据。一个请求可以拆成N个请求分别执行。比如一个查询100行记录的请求,可以拆成4个请求,分别到4个数据库中去并行执行。 并行化后,总的时延就相当于子请求的时延。由于子请求需要读取的blocks变少,相应的seek time和rotational latency都可能小;总结下来,整体请求的时延也会变小。

2. Mirroring Disks.  所有disk的数据都是一样的,N个独立的请求可以分散落到N个disk中,虽然提升不了单个请求的时延,但在高并发情况下可以提高吞吐量。但它有一个缺点:write latency比较高,因为写数据时需要将数据写到各个disk中。

为什么同一行记录要尽量存储在同一个block中?

查询数据库时,整行查询或者查询一行中多个字段的概率很高。 如果不同字段分布在不同block中,那么这次查询就要读取多个block.

1. 由于磁盘读取是以block为最小单位的,读取多个block意味比起只读一个block要多读出很多数据,增加transfer time不说,还会浪费内存。

2. 如果这些block不是连续的,那还会增加磁盘的seek time和rotational latency (
术语解释)

上面是读,写其实也是一样的。

推论:

1. 如果一行记录需要跨多个block, 也应该选择同一个track上的blocks(只有一次rotational latency) 或者同一个cylinder上的多个 blocks(只有一次seek time)

2. 如果多行记录被同时取出的概率很高,也应该如上安排,放在一起。

通用的ajax图片上传JS函数(需要html5浏览器)

/**
 * 以ajax方式上传一个图片
 * @param evt <input type="file"/>的change事件
 * @param targetElement 上传成功后会设置targetElement.value = file-url
 */
function uploadImage(evt, targetElement){

	 if ( typeof(FileReader) === 'undefined' ){ 
		 alert("您的浏览器不支持html5 文件上传。")
		 return;
	 }	 
    var files = evt.target.files; // FileList object						    
    var file = files[0]; 
    var reader = new FileReader(); 
    var m= reader.readAsDataURL(file); 
 
    reader.onload = function(e){    	 
    		var dataUrl = e.target.result;	        	
    		var base64 = dataUrl.split("base64,")[1];
			var dataToPost ={
						filename:file.name,
			    		fileAsBase64:base64
			};
			$.ajax({
				 
				  url:"/file/uploadImage",
				  data:dataToPost,
				  dataType:"json",
				  type:"POST",
				  success:function(result){
						if(result.code == "1"){
							var data = result.data ||{};	
							if(targetElement){
								targetElement.value = data.url;
							}							
						}else{
							alert(result.msg);
						}					  					  
				  },
				  error:function(jqXHR, status, error){					  
					  alert("操作失败:" + error);
				  }				  
			 });
    }
}