2013年7月 的存档

mysql partition 功能

2013年7月30日 没有评论

自mysql 5.1.3起开始支持分区功能。mysql表中存储的记录和表对应的索引信息,最后都是以文件的方式存储在计算机的硬盘上的,有了分区功能,就可以按照一定的分区规则把这些记录分布到不同的数据文件上,目前分区规则有四种,分别是RANGE、LIST、HASH和KEY,另外通过DATA DIRECTORY和INDEX DIRECTORY选项可以把不同的分区数据文件分散到不同的磁盘上,从而进步一提高系统的IO吞吐量。因此按照业务逻辑设计好了分区,可以大大提高查询效率,而且删除数据可能也会很容易。但是分区也有一些限制:1、主键或者唯一索引必须包含分区字段;2、只能通过int类型的字段或者返回int类型的表达式来分区;3、单表最多只能有1024个分区。

默认mysql是开启了分区功能的,可以通过下述查询查看结果:

show variables like '%partition%';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| have_partitioning | YES   |
+-------------------+-------+

//YES 表示开启

下面也range规则为例介绍一下分区常用的命令。

1、创建分区。可以在创建表的同时创建,也可以在表创建后追加分区。

drop table if exists `netingcn_com`;
create table `netingcn_com` (
  `id` int(11) unsigned not null auto_increment,
  `day` int(11) not null default 0,
  primary key (`id`, `day`)
) engine=innodb default charset=utf8 auto_increment=1;

alter table `netingcn_com` partition by range(`day`) (
  partition p_2012 values less than (20130000),
  partition p_2013 values less than (20140000)
);
或
drop table if exists `netingcn_com`;
create table `netingcn_com` (
  `id` int(11) unsigned not null auto_increment,
  `day` int(11) not null default 0,
  primary key (`id`, `day`)
) engine=innodb default charset=utf8 auto_increment=1 
 partition by range(`day`) (
  partition p_2012 values less than (20130000),
  partition p_2013 values less than (20140000)
);

可以explain命令查看分区是否创建成功
explain partitions select * from netingcn_com where day = 20130412;
+----+-------------+--------------+------------+-------+
| id | select_type | table        | partitions | type  |
+----+-------------+--------------+------------+-------+
|  1 | SIMPLE      | netingcn_com | p_2013     | index |
+----+-------------+--------------+------------+-------+

2、增加或删除分区。注意:删除分区的同时,该分区的所有数据也会别删除。

增加分区
alter table netingcn_com add partition (
  partition p_2014 values less than (20150000)
);

删除分区
alter table netingcn_com drop partition p_2012;

3、重新分区。注意:hash和key分区规则不能用REORGANIZE来重新分区

alter table netingcn_com reorganize partition p_2013,p_2014 into (partition p_2014 values less than (20150000));

更多关于mysql 分区功能可以参考:http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html

分类: MySQL 标签: , ,

Strict Standards: Only variables should be passed by reference in

2013年7月28日 没有评论

php中使用内置的reset函数可以获取array的第一个元素的值。例如:

$arr = array('one', 'two', 'three');

echo reset($arr);   // 输出的结果为 one

对于下述代码,如果php开启了“Strict Standards”,将会看到“Strict Standards: Only variables should be passed by reference in”的提示。

$str = 'netingcn.com';

echo reset(explode('.', $str));

为什么会这样呢?可以先看看reset函数的定义:

function reset (array &$array) {}

从定义中可以看到,reset接受的参数是一个array的引用。而上述代码中explode返回值不是任何array的引用,所以在“Strict Standards”下会有上述提示。解决办法很简单,只需要把reset(explode(‘.’, $str))分两步写即可。第一步先把explode的返回值赋给一个变量,第二步把这个变量作为reset参数。

出现上面的提示的不只是reset函数,只要参数接受的是对象引用,而传值直接使用function返回值都会看到那样的提示。例如内置的array_pop、shuffle、curent、next、prev、next等等。

分类: PHP 标签:

javascript window.open 父子窗口通讯

2013年7月27日 没有评论

js中可以使用window.open来弹出一个新窗口。例如一下代码可以弹出一个居中的窗口:

var __popupReference = null;

function openExplorerPopUp(url, width, height) {
    if (isNaN(width)) {
        width = 1000;
    }
    
    if (isNaN(height)) {
        height = screen.height * 0.8;
    }

    x = (screen.width - width) / 2;
    y = (screen.height - height) / 2;

    if ((null != __popupReference) && (undefined != __popupReference)) {
        __popupReference.close();
    }
    
    if (url.length > 0) {
        var style = "toolbar=no,location=no,directories=no,menubar=no,scrollbars=no,resizable=no,status=no,width=" + width + ",height=" + height + ",left=" + x + ",top=" + y;
        __popupReference = window.open(url, '', style);
        
        try {
            if (window.focus()) {
                __popupReference.focus();
            }
        } catch(e) {}
    }
}

如何让父窗口和弹出的新窗口进行通讯呢?下面分别阐述。

先看父窗口与子窗口如何通讯。注意上面代码中有一行“__popupReference.close();”,其用途就是用于关闭弹出的窗口,我们知道在js中可以使用window.close()来关闭当前窗口,通过行为可以得出__popupReference对象其实就是window对象结论,只不过是子窗口的。所以window.open返回值也就是子窗口的句柄了,有了这个句柄,在父窗口就可以操作子窗口的DOM、js定义的function等。例如:__popupReference.document.getElementById(‘subDomId’).style.display = ‘none’; __popupReference.subWinDefineFunction()。

在子窗口中只要能拿到父窗口的句柄,那么就能进行通讯。在内置的window对象中有一个opener属性,就是其父窗口的句柄。有了这个,通讯就很容易了。例如:
window.opener.getElementById(‘parentDomId’).style.display = ‘none’; window.opener.parentDefineFunction();

分类: web前端 标签:

mysql 清除relay-log文件

2013年7月22日 没有评论

今天在本机的mysql数据目录下发现了许多类似hostname-relay-bin.0000*的文件,该文件一般是在mysql slave实例上存在。主要用途是记录主从同步的信息,正常情况下会自动删除的。

本机未配置过master、slave,对于其来源还真不太清楚。既然是用在slave上的,那就可以放心的删除。删除master实例上的日志文件用reset master,对于slave实例就使用命令:

reset slave
分类: MySQL 标签:

mysql 关闭 bin-log 日志

2013年7月22日 1 条评论

当开启bin-log日志时,会生成很多mysql-bin.0000*类似的文件,而且可能会占用很大的硬盘空间。对于自己的测试机器或硬盘比较紧张的vps,而又不需要做master,slave的配置,完全可以关闭日志功能。

关闭操作很简单,找到配置文件my.cnf,对于linux,一般默认在/etc目录下,打开此文件,使用井号(#)注释掉如下两个配置项目即可。

log-bin=mysql-bin
binlog_format=mixed

配置修改好后需要重启mysqld服务才能生效。可能在重启时候会收到一个错误,“ERROR 1186 (HY000): Binlog closed, cannot RESET MASTER”,解决办法是先登入到mysql命令行中执行 reset master 即可。reset master的用途就是删除先前所以的bin-log日志文件。所以在master、slave配置环境中慎用此命令。

分类: MySQL 标签:

也谈empty与isset区别

2013年7月19日 没有评论

empty是判断变量值是非空或非零的值。对应空定义包括:“”(空字符串)、0、“0”、NULL、FALSE、array()和$var(只声明但未赋值)。也就是说当变量值为上述这些,empty返回TRUE,其他的都返回FALSE。

isset是检测变量是否设置,并且不是 NULL。变量设置可以从几个方面来说。1:最简单的就是变量是否先声明和赋值;2:array中是否存在对应的index或key;3:object中是否存在对应的属性。

从上面的两个function定义可以看到,在某些情况下,两者可以公用,但其区别还是很大的。另外它们都只能检测变量,检测任何非变量的东西都将导致解析错误。例如直接检查另一个function的返回值(empty(otherFunction())),你将看到“Fatal error: Can’t use function return value in write context in”这样的错误。

另外isset可以一次检查多个变量,例如:isset($var1, $var2, $var3),当这三个值分别的isset都为TRUE结果为TRUE,否则结果为FALSE。

测试代码:

$sep = "<br />";

echo 'test undeclared var empty : ';
var_dump(empty($var));	// TRUE
echo $sep . 'test undeclared var isset : ';
var_dump(isset($var));	// FALSE

$var;
echo $sep . 'test declared var but no set value empty : ';
var_dump(empty($var));	// TRUE
echo $sep . 'test declared var but no set value isset : ';
var_dump(isset($var));	// FALSE, 变量申明未赋值,默认值为NULL

$var = NULL;
echo $sep . 'test declared var and set value NULL empty : ';
var_dump(empty($var));	// TRUE
echo $sep . 'test declared var and set value NULL isset : ';
var_dump(isset($var));	// FALSE, 变量申明赋值为NULL

$var1 = ''; $var2 = '0'; $var3 = 0; $var4 = FALSE; $var5 = array();

echo $sep . 'test \'\' empty : ';
var_dump(empty($var1));	// TRUE
echo $sep . 'test \'0\' empty : ';
var_dump(empty($var2));	// TRUE
echo $sep . 'test 0 empty : ';
var_dump(empty($var3));	// TRUE
echo $sep . 'test FALSE empty : ';
var_dump(empty($var4));	// TRUE
echo $sep . 'test array() empty : ';
var_dump(empty($var5));	// TRUE
echo $sep . 'test \'\', \'0\', 0, FALSE, array() isset : ';
var_dump(isset($var1, $var2, $var3, $var4, $var5));	// TRUE,  变量申明并赋值为空字符串

输出的结果为:

test undeclared var empty : bool(true)
test undeclared var isset : bool(false)
test declared var but no set value empty : bool(true)
test declared var but no set value isset : bool(false)
test declared var and set value NULL empty : bool(true)
test declared var and set value NULL isset : bool(false)
test '' empty : bool(true)
test '0' empty : bool(true)
test 0 empty : bool(true)
test FALSE empty : bool(true)
test array() empty : bool(true)
test '', '0', 0, FALSE, array() isset : bool(true)
分类: PHP 标签:

用css设置cellspacing

2013年7月16日 没有评论

html的table标签中单元格之间默认是有一个像素的间距,且是使用白色填充的。所以对于要对tr使用非白色背景时,显示效果就很糟糕。可以使用table的cellspacing属性来设置单元格之间间距,例如:cellspacing=“0”,就能取消单元格之间的间距。 cellspacing是table的属性,不能使用在css中,如果要在table中控制单元格的间距,则是使用border-spacing,如:

border-spacing: 0;
分类: web前端 标签:

chrome切换hosts插件 hostsadmin

2013年7月16日 没有评论

HostAdmin是一款chrome插件,可以用于快速修改hosts文件中配置,达到切换域名对应的IP,真是WEB开发者的利器。例如需要把某个web应用的域名指向到本地的测试环境,只需要点几下鼠标即可搞定。另外对于chrome,修改后立马生效,不需要重新启动浏览器。经测试该插件可以正常工作在Win XP和Mac osx中。

安装方法很简单,方法1:访问地址:https://chrome.google.com/webstore/detail/hostadmin/oklkidkfohahankieehkeenbillligdn,在出现的页面中点击“添加至 CHROME”按钮即可完成安装;方法2:进入chrome store,输入 hostsadmin 查询,也可以找到该扩展程序,然后选定该扩展进行安装。

安装成功后,chrome的右上角会出现一个小图标,如下图:

点击小图标后列出系统hosts文件中的所有IP域名配置信息,如下图:

IP前面打勾表示启用该配置,可以通过点击来进行开启和关闭切换。另外点击上方的“editor”按钮,可以在浏览器中打开hosts文件,并且对其进行添加、删除和更新操作。

分类: web前端, 其它 标签:

linux下批量替换文件中的内容

2013年7月15日 没有评论

对于单个文件,使用sed命令很容易做到。如果需要替换某个指定文件夹下所有文件,借助grep和sed组合成一条命令也可以轻松搞定。grep命令可以查找单个文件或文件夹下文件中的内容,使用参数“r”或“-R”可以递归查找指定文件夹下的所有文件;参数“l”可以让grep输出包含指定字符串的文件名,首次匹配成功后立刻停止对同文件的查询。如果不使用“l“,grep查询单个文件时输出文件中所有包含指定字符串的行,对文件夹查询时则按照“文件名:包含字符串行”的方式输出。

有了上面提到的知识,执行批量替换的命令可以写为:

grep "netingcn" -rl /assign-path | xargs sed -i 's/netingcn/www\.netingcn/g' 
或
sed -i 's/netingcn/www\.netingcn/g' `grep "netingcn" -rl /assign-path`

还有一种比较复杂的写法:

grep "netingcn" * -R | awk -F: '{print $1}'  | sort | uniq | xargs sed -i 's/netingcn/www\.netingcn/g'

其中命令awk用于分割字符串、uniq对结果进行除重。

分类: Linux 标签:

sed command a expects followed by text

2013年7月15日 没有评论

在mac osx lion中sed来进行文件内容的替换操作,使用命令为:

sed -i 's/oldstring/newstring/g' full-path-file

执行后提示出错,错误信息为:“sed: 1: command a expects \ followed by text”,但是相同的命令拿到centos下确能执行成功。 使用man查看命令的参数详细说明,两个系统下对参数“i”的要求不一样。
mac osx中为:

-i extension
  Edit files in-place, saving backups with the specified extension.  If a zero-length extension is given, no backup will be saved.
  It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.

centos中为:

-i[SUFFIX], --in-place[=SUFFIX]
  edit files in place (makes backup if extension supplied)

参数“i”的用途是直接在文件中进行替换。为防止误操作带来灾难性的后果,sed在替换前可以自动对文件进行备份,前提是需要提供一个后缀名。从上面对参数“i”的详细说明中可以看到,mac osx下是强制要求备份的(当然也可以使用空字符串来取消备份),但centos下是可选的。

如果不需要备份文件,mac osx下可以使用如下命令完成替换操作:

sed -i '' 's/oldstring/newstring/g' full-path-file

例子:
cd /tmp
echo "netingcn.com" > sed_test.txt
cat sed_test.txt
sed -i '' 's/netingcn/www\.netingcn/g' sed_test.txt
cat sed_test.txt
rm -rf sed_test.txt
cd -
分类: Linux 标签: ,

无觅相关文章插件,快速提升流量