Month: November 2014

MySQL: varchar v.s. char

从SQL性能来说,两者是差不多的。有人做过benchmarking. http://blog.csdn.net/yunhua_lee/article/details/7038780 性能方面有一点可以注意:由于char类型字段可以一次性分配到固定长度的空间,系统一般会给它分配一段连续的空间,这样的话数据一般不会被fragmentation, 对性能有一定好处。 至于存储空间,一般都会用varchar以避免浪费空间,定长的类型则可以用char.

一次使用Super Smack进行MySQL benchmarking的完整经历 – 下篇:运行测试

测试要解决的问题 索引字段上是否存在空数据,对查询性能的影响有多大? 基本步骤概括 测试的准备可以分为两大部分:准备测试数据和配置smack文件。 Super Smack和其他的一些benchmark工具一样,可以把“测试数据准备”也做了,包括按需建表、导入数据等等。我原本也想让Super Smack把这一步包了,但经过反复尝试后还是放弃了: 1. Super Smack的建表和导数据的触发条件比较复杂,又老是出各种各样的错,很难解决。与其让它代劳,还不如自己执行load data更可控。 2. 在测试执行过程中临时删表(drop)、建表、导数据,这种方案本身并不可取。日常开发中,我们的表本来就建好了,不需要依赖测试工具来临时创建,而且我们也不能容许测试工具在测试过程中或测试完成后自动删除表格. 所以, 我建议使用的基本方案是: 1. 自己手动完成测试数据的准备。 2. Super Smack只管执行测试语句。 测试数据准备 –建两张表,一张允许索引字段为空,另一张不允许为空 drop table if exists index_nullable; drop table if exists index_not_nullable; create table index_nullable ( id bigint unsigned not null auto_increment, name varchar(50) default null, key idx_name (name), primary key(id) ); create table index_not_nullable …

一次使用Super Smack进行MySQL benchmarking的完整经历 – 下篇:运行测试 Read More »

MySQL表字段类型选择:长度越小越好,类型越简单越好

字段长度越小越好 字段长度越大,占用的内存、磁盘空间越大,读写时的I/O代价就越高, 同时占用的cpu周期越多。 所以,能用int, 就别用bigint.  不过,benchmarking表明,这个差别其实也不是很大。 表中数据量 操作 并发数 int类型的QPS bigint类型QPS N/A 逐渐插入100条数据到空表中 100 1092 1071 1百万 查询 100 5615 5451 注1:阿里云服务器,CPU 2核, 内存4GB, 64位CentOS, MySQL版本5.1.73,InnoDB 注2:每轮执行完后都会重启MySQL, 以消除缓存的影响 字段类型越简单越好 字段类型越复杂,占用的cpu周期越多;复杂类型的字段处理起来可能还有额外的逻辑,导致更加耗时。比如varchar类型的大小比较会牵涉到charset和collation,逻辑相对复杂,性能不如int类型。 所以, 1. 能用int, 就别用varchar 2. 如果对精度要求不高,能用float/double, 就不要用decimal 这里有人对“把IP存成varchar还是unsigned int”做了下benchmarking. 他说, 引用 Storing IPs as a string, besides requiring more disk space, takes 9% longer than …

MySQL表字段类型选择:长度越小越好,类型越简单越好 Read More »

一次使用Super Smack进行MySQL benchmarking的完整经历 – 上篇:安装

MySQL中一个被索引了的列,如果在某些行的数据是null,这对性能的影响倒底有多大? 这个需要做下benchmarking才知道。 所有相关工具中, mysqlslap应该是最轻量的; 但它的可控性实在太弱,连让测试者自己造数据都做不到。 经过比较后,我发现最适合的工具应该是Super Smack.  用它做完测试后,结论很简单:被索引列是否可空,对性能的影响很小。 对我来说,更大的收获是学会了用专门的工具进行sql Benchmarking. 由于Super Smack是一个非常简陋的软件,安装、使用它的过程非常痛苦,痛苦到不停地想放弃。 然而。。。还是。。。 废话少说,先说下安装。 在64位CentOS上安装Super Smack 1.下载 传说中的 Tony Bourke维护的版本已经废了(网站都关了),我们只能从这里下载: https://github.com/tmountain/Super-Smack 2.安装mysql client相关的lib 直接./configure会出一堆错。你要先安装 yum install mysql-devel 由于Super Smack不会去lib64目录下找lib, 你还得把相关lib“复制”到/usr/lib目录中。 ln -s /usr/lib64/mysql/libmysqlclient_r.so.16.0.0 /usr/lib/libmysqlclient.so 3. 还要改一下源码中的一个头文件 在dictionary.h加入 #include <string.h> 4. 接下来正常安装 ./configure –with-mysql make make install 5.试运行 #从自带的smack中复制一个出来,免得把原来的改坏了 cp smacks/select-key.smack smacks/my.smack 接下来修改my.smack里面的mysql配置,包括client admin和client smacker1的user, pass, …

一次使用Super Smack进行MySQL benchmarking的完整经历 – 上篇:安装 Read More »

js代码片断:string的format方法

JS中直接用加号拼字符串是件很恶心的事情,比如 return ‘<a href="’ + url + ‘">’ + name + ‘ </a>’; 应该使用字符串模板+占位符来解决这个问题。 第1步: 在公用的js中为String类加一个方法. String.prototype.format = function() { var args = arguments; return this.replace(/{(\d+)}/g, function(match, number) { return typeof args[number] != ‘undefined’ ? args[number] : match ; }); }; 第2步:使用模板 var template = ‘<a href="{0}">{1}</a>’; return template.format(url, name);

DataTables: 删除记录的最佳实践

在表格中删除一行或多行,一般要满足: 1. 删除时不重新加载页面,要ajax 2. 删除后重新渲染表格时不会跳到第1页,不会清空当前的搜索条件 我是这么做的: var table; $( document ).ready(function() { //正式初始化table table = $(‘#myTable’).DataTable({… }); }); function delete(id){ $.ajax({ … success: function(resp){ table.draw(false); //删除记录后,立即重新渲染表格。false参数的意思是不reset, 即渲染时停留在当前页,不清空当前搜索条件 } … }); }

DataTables: 查询当前表格的状态

列一些常用的JS语句,用于查询当前表格的状态。 查询当前表格的状态 if(table.order().length > 0){ //已按其中一列排序? … } table.columns().eq( 0).each( function ( colIdx ) { var column = table.column( colIdx ); if(column.search()){ //已按某列搜索? … } }); var sexColumn = table.column(‘sex:name’); if(sexColumn.search() == ‘male’){ //已按 性别==男 搜索? … }

DataTables: 按列搜索的最佳实践

典型情况下,按列搜索需要满足: 1. 输入文字,在某列中搜索 2. 下拉选择,在某列中搜索 3. 输入框、下拉列表都应该放在表头,而不是表尾。 我是这样做的: html dom这么写 把搜索那一行作为tfoot加进来 <table id="myTable"> <thead> <tr> <th>姓名</th> <th>性别</th> <th>创建时间</th> </tr> </thead> <tfoot> <tr> <th><input type="text" class="searchField" ></th> <th><input type="text" class="searchField"></th> <th> <select class="searchField" > <option value="">不限</option> <option value="male">男</option> <option value="female">女</option> </select> </th> <th></th> </tr> </tfoot> </table> 让tfoot在上面,而不是在下面 <style style="text/css"> </style> tfoot { display: table-header-group; } 对应的javascript事件处理 …

DataTables: 按列搜索的最佳实践 Read More »

DataTables: ajax request/response的服务端建模(java)

DataTables的Ajax Http Request的结构非常奇葩,比如 引用 columns[0][data]:id columns[0][name]:id columns[0][searchable]:true columns[0][orderable]:false columns[0][search][value]:174940 columns[0][search][regex]:false columns[1][data]:sex columns[1][name]:sex columns[1][searchable]:true columns[1][orderable]:false columns[1][search][value]: columns[1][search][regex]:false 服务端的正常API不可能接受这种参数。相反它更愿意接受id, sex这种参数。 所以我们要有一个通用的解析器(parser), 从上面的奇葩中解析出id=174940, sex=male这种参数; 通用的解析器必定会有一个通用的结果,我们需要建模这个结果类。 另外,Data Tables的ajax http response也必须遵守一定规范。我们也应该在后端专门建一个通用的response 对象。  我在网上搜了很久,都没搜到现在的。所以我只好自己写。 一个依赖 <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> Request package player.kent.chen.demo.datatables; import java.util.LinkedHashMap; import java.util.Map; /** * datatables ajax 请求建模. 见 http://datatables.net/manual/server-side <br/> * 注:1.不支持regex search <br/> * 2.只支持单一维度排序 …

DataTables: ajax request/response的服务端建模(java) Read More »