头像

mysql分表,分区的区别和联系

一,什么是mysql分表,分区

什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法

什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上,具体请参考mysql分区功能详细介绍,以及实例

二,mysql分表和分区有什么区别呢

1,实现方式上

a),mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

  1. [root@BlackGhost test]# ls |grep user
  2. alluser.MRG
  3. alluser.frm
  4. user1.MYD
  5. user1.MYI
  6. user1.frm
  7. user2.MYD
  8. user2.MYI
  9. user2.frm

简单说明一下,上面的分表呢是利用了merge存储引擎(分表的一种),alluser是总表,下面有二个分表,user1,user2。他们二个都是独立的表,取数据的时候,我们可以通过总表来取。这里总表是没有.MYD,.MYI这二个文件的,也就是说,总表他不是一张表,没有数据,数据都放在分表里面。我们来看看.MRG到底是什么东西

  1. [root@BlackGhost test]# cat alluser.MRG |more
  2. user1
  3. user2
  4. #INSERT_METHOD=LAST

从上面我们可以看出,alluser.MRG里面就存了一些分表的关系,以及插入数据的方式。可以把总表理解成一个外壳,或者是联接池。

b),分区不一样,一张大表进行分区后,他还是一张表,不会变成二张表,但是他存放数据的区块变多了。

  1. [root@BlackGhost test]# ls |grep aa
  2. aa#P#p1.MYD
  3. aa#P#p1.MYI
  4. aa#P#p3.MYD
  5. aa#P#p3.MYI
  6. aa.frm
  7. aa.par

从上面我们可以看出,aa这张表,分为二个区,p1和p3,本来是三个区,被我删了一个区。我们都知道一张表对应三个文件.MYD,.MYI,.frm。分区呢根据一定的规则把数据文件和索引文件进行了分割,还多出了一个.par文件,打开.par文件后你可以看出他记录了,这张表的分区信息,根分表中的.MRG有点像。分区后,还是一张,而不是多张表。

2,数据处理上

a),分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。看下面的例子:

select * from alluser where id=’12’表面上看,是对表alluser进行操作的,其实不是的。是对alluser里面的分表进行了操作。

b),分区呢,不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。

3,提高性能上

a),分表后,单表的并发能力提高了,磁盘I/O性能也提高了。并发能力为什么提高了呢,因为查寻一次所花的时间变短了,如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。磁盘I/O性能怎么搞高了呢,本来一个非常大的.MYD文件现在也分摊到各个小表的.MYD中去了。

b),mysql提出了分区的概念,我觉得就想突破磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。
在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。

4),实现的难易度上

a),分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式根分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。

b),分区实现是比较简单的,建立分区表,根建平常的表没什么区别,并且对开代码端来说是透明的。

三,mysql分表和分区有什么联系呢

1,都能提高mysql的性高,在高并发状态下都有一个良好的表面。

2,分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。


作者:海底苍鹰
转载地址:http://blog.51yip.com/mysql/1029.html

头像

PHP代码运行流程

Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL,举个例子,比如你写下了如下的PHP代码:


  1.  <?php
  2.    echo "Hello World";
  3.    $a = 1 + 1;
  4.    echo $a;
  5. ?>

PHP执行这段代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)


  1. Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
  2. Parsing, 将Tokens转换成简单而有意义的表达式
  3. Compilation, 将表达式编译成Opcodes
  4. Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

题外话:现在有的Cache比如APC,可以使得PHP缓存住Opcodes,这样,每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度。

那什么是Lexing? 学过编译原理的同学都应该对编译原理中的词法分析步骤有所了解,Lex就是一个词法分析的依据表。 Zend/zend_language_scanner.c会根据Zend/zend_language_scanner.l(Lex文件),来输入的 PHP代码进行词法分析,从而得到一个一个的“词”,PHP4.2开始提供了一个函数叫token_get_all,这个函数就可以讲一段PHP代码 Scanning成Tokens;
如果用这个函数处理我们开头提到的PHP代码,将会得到如下结果:


  1. Array
  2. (
  3.     [0] => Array
  4.         (
  5.            [0] => 367
  6.            [1] => Array
  7.         (
  8.             [0] => 316
  9.             [1] => echo
  10.         )
  11.     [2] => Array
  12.         (
  13.             [0] => 370
  14.             [1] =>
  15.         )
  16.     [3] => Array
  17.         (
  18.             [0] => 315
  19.             [1] => "Hello World"
  20.         )
  21.     [4] => ;
  22.     [5] => Array
  23.         (
  24.             [0] => 370
  25.             [1] =>
  26.         )
  27.     [6] => =
  28.     [7] => Array
  29.         (
  30.             [0] => 370
  31.             [1] =>
  32.         )
  33.     [8] => Array
  34.         (
  35.             [0] => 305
  36.             [1] => 1
  37.         )
  38.     [9] => Array
  39.         (
  40.             [0] => 370
  41.             [1] =>
  42.         )
  43.     [10] => +
  44.     [11] => Array
  45.         (
  46.             [0] => 370
  47.             [1] =>
  48.         )
  49.     [12] => Array
  50.         (
  51.             [0] => 305
  52.             [1] => 1
  53.         )
  54.     [13] => ;
  55.     [14] => Array
  56.         (
  57.             [0] => 370
  58.             [1] =>
  59.         )
  60.     [15] => Array
  61.         (
  62.             [0] => 316
  63.             [1] => echo
  64.         )
  65.     [16] => Array
  66.         (
  67.             [0] => 370
  68.             [1] =>
  69.         )
  70.     [17] => ;
  71. )

分析这个返回结果我们可以发现,源码中的字符串,字符,空格,都会原样返回。每个源代码中的字符,都会出现在相应的顺序处。而,其他的比如标签,操作符,语句,都会被转换成一个包含俩部分的Array: Token ID (也就是在Zend内部的改Token的对应码,比如,T_ECHO,T_STRING),和源码中的原来的内容。
接下来,就是Parsing阶段了,Parsing首先会丢弃Tokens Array中的多于的空格,然后将剩余的Tokens转换成一个一个的简单的表达式


  1. echo a constant string
  2. add two numbers together
  3. store the result of the prior expression to a variable
  4. echo a variable

然后就改Compilation阶段了,它会把Tokens编译成一个个op_array, 每个op_arrayd包含如下5个部分:


  1. Opcode数字的标识,指明了每个op_array的操作类型,比如add , echo
  2. 结果 存放Opcode结果
  3. 操作数1 给Opcode的操作数
  4. 操作数2
  5. 扩展值 1个整形用来区别被重载的操作符

比如,我们的PHP代码会被Parsing成:


  1. * ZEND_ECHO ‘Hello World’
  2. * ZEND_ADD ~0 1 1
  3. * ZEND_ASSIGN !0 ~0
  4. * ZEND_ECHO !0

呵呵,你可能会问了,我们的$a去那里了?

恩,这个要介绍操作数了,每个操作数都是由以下俩个部分组成:


  1. a)op_type : 为IS_CONST, IS_TMP_VAR, IS_VAR, IS_UNUSED, or IS_CV
  2. b)u,一个联合体,根据op_type的不同,分别用不同的类型保存了这个操作数的值(const)或者左值(var)

而对于var来说,每个var也不一样

IS_TMP_VAR, 顾名思义,这个是一个临时变量,保存一些op_array的结果,以便接下来的op_array使用,这种的操作数的u保存着一个指向变量表的一个句柄(整数),这种操作数一般用~开头,比如~0,表示变量表的0号未知的临时变量

IS_VAR 这种就是我们一般意义上的变量了,他们以$开头表示

IS_CV 表示ZE2.1/PHP5.1以后的编译器使用的一种cache机制,这种变量保存着被它引用的变量的地址,当一个变量第一次被引用的时候,就会被CV起来,以后对这个变量的引用就不需要再次去查找active符号表了,CV变量以!开头表示。

这么看来,我们的$a被优化成!0了。

PS:转自鸟哥博客!!!

头像

php中常见的一些大坑,开发时应尽量避免

1、不同系统获取的路径,文件名编码不同

2、32位和64位PHP最大值不同PHP_INT_SIZE,PHP_INT_MAX,intval

3、filesize不能正确获取大于2G文件的大小

4、filesize缓存的问题,需调用clearstatcache

5、内部编码使用ansi

6、保存文件使用utf-8必须删除bom签名

7、json_encode只能支持utf-8编码

8、trim中有中文空格会引起乱码

9、strrchr仅能查找字符,不能查找字符串

10、foreach中的值使用引用会引起赋值,并且不会释放
测试如下代码
$a = array(1=>’one’, 2=>’two’);

foreach ($a as $key => &$val) {}
var_dump($a);

foreach ($a as $key => $val) {}

var_dump($a);

11、含有字符的数字和数字比较有可能为真。
测试如下代码

‘404abc’==404

12、count函数传入字符时,会自动将字符转换为数组将计算。
测试如下代码
count(false)
count(null)

13、浮点运算时应注意丢失精度(PHP遵循IEEE 754双精度)
测试如下代码
floor((0.1+0.7)*10)
intval( 0.58*100 )
var_dump((8 – 6.4) == 1.6)

头像

post和get的区别

POST和GET都是向服务器提交数据,并且都会从服务器获取数据。

区别:

1、传送方式:get通过地址栏传输,post通过报文传输。

2、传送长度:get参数有长度限制(受限于url长度),而post无限制

3、GET和POST还有一个重大区别,简单的说:

GET产生一个TCP数据包;POST产生两个TCP数据包

长的说:

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

也就是说,GET只需要汽车跑一趟就把货送到了,而POST得跑两趟,第一趟,先去和服务器打个招呼“嗨,我等下要送一批货来,你们打开门迎接我”,然后再回头把货送过去。

因为POST需要两步,时间上消耗的要多一点,看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能。但这是一个坑!跳入需谨慎。为什么?

1. GET与POST都有自己的语义,不能随便混用。

2. 据研究,在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。

3. 并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

建议:

1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;

2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式;

案例:一般情况下,登录的时候都是用的POST传输,涉及到密码传输,而页面查询的时候,如文章id查询文章,用get 地址栏的链接为:article.php?id=11,用post查询地址栏链接为:article.php, 不会将传输的数据展现出来。

拓展资料:

GET在浏览器回退时是无害的,而POST会再次提交请求。

GET产生的URL地址可以被Bookmark,而POST不可以。

GET请求会被浏览器主动cache,而POST不会,除非手动设置。

GET请求只能进行url编码,而POST支持多种编码方式。

GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

GET请求在URL中传送的参数是有长度限制的,而POST么有。

对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

GET参数通过URL传递,POST放在Request body中。

头像

include,include_once,require,require_once的区别

了解下include、include_once、require和require_once这4个函数:

  • include函数:会将指定的文件读入并且执行里面的程序;
  • require函数:会将目标文件的内容读入,并且把自己本身代换成这些读入的内容;
  • include_once 函数:在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次;
  • require_once 函数:和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

1 include与require的区别

include与require除了在处理引入文件的方式不同外,最大的区别就是:include在引入不存文件时产生一个警告且脚本还会继续执行,而require则会导致一个致命性错误且脚本停止执行。

<?php
  include 'no.php';
  echo '123';
?>

如果no.php文件不存在,echo ‘123’这句是可以继续执行的.

你看到的可能是类似下边的情况:

点击查看原图

<?php
require 'no.php';
echo '123';
?>

如果no.php文件不存在,echo ‘123’这句是不执行的,在require时就停止了。

你看到的可能是类似下边的情况:

点击查看原图

include()与require()的功能相同,但在用法上却有一些不同,include()是有条件包含函数,而 require()则是无条件包含函数。

例如在下面的一个例子中,如果变量$somgthing为真,则将包含文件somefile:

if($something){
include("somefile");
}

但不管$something取何值,下面的代码将把文件somefile包含进文件里:

if($something){
require("somefile");
}

2 include与include_once的区别(require与require_once的区别)

include_once (require_once)语句在脚本执行期间包含并运行指定文件。此行为和 include (require)语句类似,区别是如果该文件中的代码已经被包含了,则不会再次包含,只会包含一次。include_once(require_once)需要查询一遍已加载的文件列表, 确认是否存在, 然后再加载。

<?php
require '1.php';
require '1.php';
?>

这种情况下1.php被包含两次。

<?php
require '1.php';
require_once '1.php';
?>

这种情况下,第二次包含时,是不会进行包含的。

include(require)与include_once(require_once)的抉择问题

通常:include_once和require_once会有性能上的下降,因为他需要判断之前是否包含过。一般情况下,也不太需要去考虑,除非这已经影响到你程序的性能了。

如果使用 APC 尽量也不要用include_once,因为apc.include_once_override配置项没有很好的被实现(详情百度)。

注1:Alternative PHP Cache (APC)是一种对PHP有效的开放源高速缓冲储存器工具,它能够缓存opcode的php中间码。

require通常使用方法,这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,亦可以这个方法将它引入网页中。

include通常使用方法,这个函数一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。

return 在返回引用的时候加上括号不但效率低而且会造成逻辑错误。那么这几个函数呢?

理论上来说:include和require后面加不加括号对执行结果没有区别,但是加上括号效率较低,所以后面能不加括号就不加括号。