Month: 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. 如果多行记录被同时取出的概率很高,也应该如上安排,放在一起。

各种存储的latency

1. Cache – 几个ns 2. Main Memory  – 10-100 ns 3. Secondary Storage(一般是磁盘) – HDD 3-10ms, SSD 0.1ms 4. Tertiary Storage(磁带,DVD) – 秒级或分钟级

通用的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 …

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