php开发中mysql的预编译如何

    长话短说。php项目里最常见的安全漏洞就是SQL注入了人,这也是php项目和其他语言开发的项目相比最容易出问题的地方。
    PHP程序员不太了解预编译是很正常也很普遍的。这个主要是由于MYSQL的预编译和变量绑定比较弱造成的,因为90%的php代码搭配的是mysql数据库,所以大部分php程序员也就不清楚这块的知识了。而oracle,MSSQL这比MYSQL要强的多,相比通常搭配这两个数据库的语言来说,JAVA和NET程序员更了解这块知识。而PDO和MYSQLI在php开发里还没普及,不少技术人员产生惰性,容易引发不少潜在的漏洞。
主要结论:
(1)MYSQL是支持预编译的。
(2)MYSQL的预编译很弱,如仅仅是session级别,对执行效率提升不明显。
(3)程序是否支持预编译,除了数据库支持外,还需要驱动支持。PDO和MYSQLI均支持。
(4)预编译干两件事,转义和软解析提速。
(5)即使是在oracle中,预编译和变量绑定也不一定就能提速,反而有可能会因为执行计划被改变造成效率低下。有些数据库预编译反而会造成效率下降。
(6)预编译和绑定变量是什么关系?其实二者是同一回事的不同阶段的叫法。
--------------------------附---------------------------------
在MYSQL里怎么用预编译:
create table ttest (ID int(4) auto_increment primary key, name varchar(20),age int(4));
insert into ttest (name,age) values ('li',10);
prepare mysqlpre from 'select * from ttest where name = ?';
set @name='li';
execute mysqlpre using @name;
查看反馈结果:
show status like '%prepare%';

mysql条件注释

    刚刚在某论坛看到有人问MYSQL的注释,按照小概率事件不会发生的道理,想必这个问题肯定还是有不少人没有关注过,或者也没仔细思考。
    常见的两种注释 -- 和 # 都很简单,需要注意的就是两个 -- 后面是有一个空格字符(可以是空格或者tab等)的。
接下来,让我们困惑的就是类似下面的注释了,通常在一些工具导出的SQL文件里会有,如
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
    和我们常见的C风格的注释不一样,有的/**/里面有个感叹号,这是什么原因呢?
    原来mysql除了支持普通的/**/注释外,也支持/!**/风格的条件注释。这种风格的注释里的SQL代码都会被MYSQL执行,但是其它SQL服务器不认识这种注释,因此这种注释也就成了mysql专用的注释了,同时具备了兼容性。因此下面这种语句也是可以执行的:
SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...
     那还有一个疑问,文章开头的那段注释里的40101是什么意思,这实际上是MYSQL的版本号,也就是形同4.01.01这样的版本号,4是大版本号,接下来的是小版本号。也就是说注释里的代码只有在当前MYSQL的版本大于等于4.01.01时才会被执行。
    其实这样的小知识点,只要是有一点点好奇心和学习精神的,我想都不会放过任何组丝马迹的,多保持好奇心就够了。详细的解释可以参见官方手册。http://dev.mysql.com/doc/refman/5.5/en/comments.html
     还有最后一个问题,@是什么意思呢,@就是session变量,只在当前会话中有效。

MySQL InnoDB内核解密

本文主要包含:


  • MySQL/InnoDB记录的数据存储结构图.
  • 对每一部分的描述.
  • 示例.

在阅读了本文后, 你将了解到MySQL/InnoDB存储引擎的物理结构


存储结构


这个表格包含了innodb存储结构的三个部分.


Name Size
Field Start Offsets (F*1) or (F*2) bytes
Extra Bytes 6 bytes
Field Contents 由存储内容而定

提示: 'F' 代表 字段的数量.

The meaning of the parts is as follows:


  • Field Start Offsets代表了一组字段的起始位置.
  •  EXTRA BYTES 是固定尺寸的记录头.
  • FIELD CONTENTS 存储了实际的数据.

An Important Note About The Word "Origin"

The "Origin" or "Zero Point" of a record is the first byte of the Field Contents --- not the first byte of the Field Start Offsets. If there is a pointer to a record, that pointer is pointing to the Origin. Therefore the first two parts of the record are addressed by subtracting from the pointer, and only the third part is addressed by adding to the pointer.


FIELD START OFFSETS


The Field Start Offsets is a list in which each entry is the position, relative to the Origin, of the start of the next field. The entries are in reverse order, that is, the first field's offset is at the end of the list.

An example: suppose there are three columns. The first column's length is 1, the second column's length is 2, and the third column's length is 4. In this case, the offset values are, respectively, 1, 3 (1+2), and 7 (1+2+4). Because values are reversed, a core dump of the Field Start Offsets would look like this: 07,03,01.

There are two complications for special cases:


  • Complication #1: The size of each offset can be either one byte or two bytes. One-byte offsets are only usable if the total record size is less than 127. There is a flag in the "Extra Bytes" part which will tell you whether the size is one byte or two bytes.
  • Complication #2: The most significant bits of an offset may contain flag values. The next two paragraphs explain what the contents are.

When The Size Of Each Offset Is One Byte


  • 1 bit = NULL, = NULL
  • 7 bits = the actual offset, a number between 0 and 127

When The Size Of Each Offset Is Two Bytes


  • 1 bit = NULL, = NULL
  • 1 bit = 0 if field is on same page as offset, = 1 if field and offset are on different pages
  • 14 bits = the actual offset, a number between 0 and 16383

It is unlikely that the "field and offset are on different pages" unless the record contains a large BLOB.


 EXTRA BYTES

阅读剩余部分...

oracle行链接和行迁移的秘密


如果你的Oracle数据库性能低下,行链接和行迁移可能是其中的原因之一。我们能够通过合理的设计或调整数据库来阻止这个现象。行链接和行迁移是能够被避免的两个潜在性问题。我们可以通过合理的调整来提高数据库性能。本文主要描述的是:


● 什么是行迁移与行链接● 如何判断行迁移与行链接● 如何避免行迁移与行链接

当使用索引读取单行时,行迁移影响OLTP系统。最糟糕的情形是,对所有读取操作而言,增加了额外的I/O。行链接则影响索引读和全表扫描。注:在翻译行(row)时使用记录来描述(便于理解),如第一行,使用第一条记录。



操作系统块的大小是操作系统读写的最小操作单元,也是操作系统文件的属性之一。当创建一个数据库时,选择一个基于操作系统块的整数倍大小作为Oracle数据库块的大小。Oracle数据库读写操作则是以Oracle块为最小单位,而非操作系统块。一旦设置了Oracle数据块的大小,则在整个数据库生命期间不能被更改(除 Oracle 9i之外)。因此为Oracle数据库定制合理的Oralce块大小,象预期数据库总大小以及并发用户数这些因素应当予以考虑。

数据库块由下列逻辑结构(在整个数据库结构下)
01.jpg

头部:头部包含一些常用信息,象块地址,段的类型(表段、索引段等)。也包含一些表、实际数据行的地址信息等。

阅读剩余部分...

mysql的BASE64编码和解码实现

刚好需要,找到了这个东西。mysql有MD5,AES,DES等加密函数,不过恰恰却没有BASE64编码解码函数。找到了原文:http://forums.mysql.com/read.php?10,404800,404800#msg-404800
http://wi-fizzle.com/downloads/base64.sql
下面的代码来自Gist https://gist.github.com/1724446

当然了,除非特殊需要,不推荐这么使用。如果技术够的话,可以写成UDF。
汉字等还需要注意编码

几组极易混淆概念的理解(2)进程(process)和线程(thread).

      进程和线程这对概念的理解也是很难的,至今网络上可查的资料对其的理解出入都挺大,在不同的操作系统中,如linux和windows中,其概念和实现都是有出入的。因此,我在这里结合我自己的理解谈下这两个概念,讲的都是一般性的概念,并且主要是基以WINDOWS的。
     一般将进程定义为一个正在运行的程序的实例。我们在任务管理器重所看到的每一项,就可以理解为一个进程,每个进程都有一个地址空间,这个地址空间里有可执行文件的代码和数据,以及线程堆栈等。一个程序至少有一个进程。进程可以创建子进程,创建的子进程可以和父进程一起工作,也可以独立运行。
     而线程是隶属于进程的,也就是说,线程是不能单独存在的,线程存在于进程中。每个进程至少有一个主线程,进程里的线程就负责执行进程里的代码,这也叫做进程的“惰性”。线程所使用的资源是它所属的进程的资源。线程也有自己的资源,主要组成部分就是一些必要的计数器和线程栈,占用的资源很少。我们可以理解为进程就是个容器,而线程才是真正干活的。线程可以在内核空间实现,也可以在用户空间实现。
     这里特别提一下linux,在linux中,每一个进程都必须有一个父进程(如果没有父进程,则把PID=1的根进程作为其父进程)。进程退出了,就成了僵尸进程,等待父进程的退出信号,如果父进程没有给他发信号,得给他找一个父进程,或者等待内核自动销毁。Linux内核只提供了轻量进程的支持,限制了更高效的线程模型的实现,但Linux着重优化了进程的调度开销,使得linux进程切换开销较小。所以linux系统没有真正意义上的线程机制。linux中,Linux线程是通过进程来实现,进程和线程是同一个层次的。(我这里提到的是基于linux 2.6 内核的,在最新的LINUX中,对线程的实现做了优化,但是还是基于进程的。有些linux实现了新的线程机制,但主流还是和我描述的一样)
   进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这也是进程和线程的重要区别。
     比如,windows中的explorer就是资源管理器进程,我们每打开一个窗口,这个进程就会创建一个线程。有上面的描述,我们可以知道,进程有独立的地址空间,多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
     在第一节中,我提到过,“并发!=多线程“,是的。如Unix操作系统和Windows操作系统支持多用户、多进程的并发执行,而Java这样的语言支持应用程序进程内部的多个执行线程的并发执行。我们知道,php在语法上是没有多线程这个概念的,那java/NET的多线程是怎么实现的。实际上,java只是通过native方法调用操作系统API来创建多线程而已。另外,我们经常说某个网站并发是多少多少,nginx是高并发服务器了。。这里的并发和我前面的并发概念是不同的。要想做到高并发,除了多线程等的实现,还需要各种好的IO机制,不然线程再多也没用,资源利用跟不上来。高并发又跟同步、异步等IO复用机制有了牵连。
      下面列举一下进程和线程中的一些概念。
进程:创建,销毁,创建子进程(fork),优先级。
线程:创建,挂起,恢复,销毁,切换,协作,睡眠,唤醒,等待,同步,锁,优先级。
      从上面的描述,基本可以理清进程和线程的关系了。最后总结下:
1.linux没有内核上的多线程实现,但是不能说linux没有多线程。WINDOWS有内核的多线程实现。
2.进程开销大,线程开销小,但是linux的进程和线程开销差异不明显。
3.并行的实现离不开多线程。
     再留个悬念,多线程的实现和运行还会涉及到同步异步,原子性等概念。这些概念是相互交叉的,这里先不做深入。

几组极易混淆概念的理解(1)--并发和并行

     最近正想整理下这个专题,想了下,主要有以下几组概念,我们时不时会听到,但只要一细想就会觉得困惑,觉得没那么简单。这几组概念有:
1.并发和并行
2.线程与进程
3.缓冲与缓存
4.同步与异步
5.阻塞与非阻塞
6.原子性与事务性
     这几组概念,不仅概念间容易混淆,而且一组概念和另一组概念之间又存在交叉,极容易搞混。
------------------------------------------------------------------------
    下面,就我所了解的知识,分门别类的谈一下这几个概念间的关系,如有不当之处,还望指出和补充。
1.并发( concurrency)和并行( Parallelism)
   狭义的并发和并行属于操作系统里的概念。并发和并行是两个即有相同处,又有区别的概念,相同的地方在于他们都是指同时处理多个任务。不同的地方在于并发是逻辑上的,并行是物理上真真实实的。
    我们都清楚,在单个CPU的情况下,对于到达CPU执行单元的作业(作业就是待执行的进程和线程),都是需要排队的,因为我只有一个窗口,你要吃饭,就必须到我这个窗口来,也就是说CPU资源是有限的。假如说这个时候,某个作业一直占着CPU资源不放,那么其他作业就得不到执行,也就是被阻塞,被挂起了。这就需要一种机制,保证每个作业都有机会被执行到,这种机制就叫做处理器的调度机制,其中又分为抢占式和非抢占式的调度。细分后又有先来先服务(老老实实排队,谁先到就服务谁),最短作业优先(哪个好搞定就先服务谁),优先级调度,时间片调度等。并发就是通过时间片轮转的方式实现的,一个作业执行一段时间后被中断,换另外一个上去,大家都有机会被执行到。
       时间片轮转,就涉及到一个进程切换的问题,频繁的切换必然带来性能开销。我们看到的一个程序一直在持续运行,但实际上并不是这样的,从CPU级别的粒度上讲,其实是多个程序间在快速的切换,只是这个切换的速度很快(想一下,CPU的主频现在都有2GHZ了),我们感觉不到而已。在早期的操作系统中,不支持多任务,一个任务在执行,其它任务就必须等待。
       废话说了这么多,就是要说明,并发就是多个进程或线程在同时执行,但实际上,他们并不是真正的在同一个时间点上一起跑的,而是我跑一段时间后,接下来你跑,我再跑,看起来我们都在跑,这就是并发。
     而并行,则是实实在在的多个进程同时跑在高速公路上,齐头并进。看下面的图,上面的是并发,下面的是并行。
bf.jpg
    通过我前面的描述,可以知道,并发是由CPU调度算法实现的,只需要一个CPU即可实现并发。而并行则要在多核或者多处理器情况下才能做到,单CPU是无法实现并行的,因为任一个时刻点上只有一个程序在处理器上运行。并行计算,这就是当今大型计算机所要实现的难题,如何让几千个CPU进行协作。并发和并行都需要处理器和OS的支持。
       提到并发,就难免会提到多线程,并发!=多线程,多线程只是一种并发的实现模型。这里暂且留作后话。根据我们前面的描述,可以知道,时间片切换是有开销的,因此多线程不一定就能发挥出更佳的效率,特别是在单处理器的情况下。故,多线程也是不能盲目迷信的。

转:迅雷、快车下载地址加密算法

转自:http://www.yexiwei.com/post/219/
留下备用
1、迅雷专用链接编码

在原地址前面加”AA”,后面加”ZZ”(不包括引号),地址变为

AAhttp://www.yexiwei.com/10k.jpgZZ

此地址base64编码为

QUFodHRwOi8vd3d3LnlleGl3ZWkvMTBrLmpwZ1pa

迅雷专链即在上地址前加thunder://,即

thunder://QUFodHRwOi8vd3d3LnlleGl3ZWkvMTBrLmpwZ1pa

2、快车专用链接编码

在原地址前后都加上”[FLASHGET]“(不包括引号),地址变为

[FLASHGET]http://www.yexiwei.com/10k.jpg[FLASHGET]

此地址base64编码为

W0ZMQVNIR0VUXWh0dHA6Ly93d3cueWV4aXdlaS5jb20vMTBrLmpwZ1tGTEFTSEdFVF0=

快车专链即在上地址前加flashget://,注意后面还要加上”&符号”,符号怎么得出不清楚,在最后面加的是我的个人信息,至今未有人报告转换错误,即

Flashget://W0ZMQVNIR0VUXWh0dHA6Ly93d3cueWV4aXdlaS5jb20vMTBrLmpwZ1tGTEFTSEdFVF0=&yexiwei

    Page :
  1. 1
  2. 2
  3. 3
  4. 4
  5. ...
  6. 11