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

阅读剩余部分...

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。
汉字等还需要注意编码

jmeter教程2-mysql测试

使用mysql自带的mysqlslap工具测试数据库的性能,命令行的方式并不太友好,这里我们仍然介绍下jmeter来测试mysql。Jmeter使用了JDBC技术,使得可以测试任何支持JDBC技术的数据库,包括mysql,oracle,pgsql,Mssql等。我们分步演示下jmeter测试mysql的步骤。
(1)    仍然是新建测试计划,在其下新建一个线程组。并设置并发为50,不循环。
(2)    配置JDBC。在线程组上点击右键,选择添加→配置元件→JDBC Connection Configuration。配置各项参数,其中Variable Name:可以随便填写,此处填写mysql。最主要的配置是Database  Connection Configuration.
Database URL:JDBC格式的数据库连接,每种数据库的URL都有所区别。Mysql的如下,jdbc:mysql://localhost:3306/test,test为数据库名称。
JDBC Driver class:JDBC驱动的名称
Username:数据库用户名
Password:数据库密码
其它配置项保持默认即可。
 2011-10-25_035256.png
添加了JDBC参数后,我们还需要添加mysql的JDBC驱动。因为jmeter并没有自带这一jar包。可以到mysql官方网站找到mysql的JDBC驱动,在“测试计划”中添加class path。如图所示:
 2011-10-25_041057.png
如果忘了这一步的话,将导致运行失败。
(3)添加JDBC请求。需要修改的参数包括:

阅读剩余部分...

MySQL Optimize Table

    Optimize Table是个好东西,很难说他能帮我们提高系统运行效率(具体的讨论可以到这里看:http://www.xaprb.com/blog/2010/02/07/how-often-should-you-use-optimize-table/),但明显的是可以帮我们回收更多的空间、减少碎片。
    官方是这么说的
OPTIMIZE TABLE should be used if you have deleted a large part of a table or if you have made many changes to a table with variable-length rows (tables that have VARCHAR, VARBINARY, BLOB, or TEXT columns). Deleted rows are maintained in a linked list and subsequent INSERT operations reuse old row positions. You can use OPTIMIZE TABLE to reclaim the unused space and to defragment the data file. After extensive changes to a table, this statement may also improve performance of statements that use the table, sometimes significantly.

1. 回收空间 Defragment

在InnoDB的维护过程中,我们总会遇到磁盘耗尽、或者InnoDB Tablespaces用完的情况。这时候,在考虑扩容等方案之前,最好先使用Optimize Table试试。如果你的表大字段(Text Blob Varchar),并且更新、删除较频繁的话,Optimize之后可能会腾出大量的空间。需要注意的是这仅仅是针对INNODB而言的

2. InnoDB 和 MyISAM

目前支持optimize命令的引擎有 MyISAM, InnoDB, and ARCHIVE,对于InnoDB,会将optimize命令映射为ALTER TABLE命令,该命令会重建数据表,更新索引统计信息、回收主键索引中空间。
     如果你的MySQL是有备库的,如果你只希望在主库上执行的话,那么可以加上关键字NO_WRITE_TO_BINLOG(或者LOCAL,意思完全相同)。


用mysqlslap进行mysql压力测试

mysqlslap是一个mysql官方提供的压力测试工具,通过模拟多个并发客户端访问mysql来执行测试,使用起来非常的简单。通过mysqlslap –help可以获得可用的选项。
下面我们就来看看一些比较重要的参数:
--defaults-file,配置文件存放位置
–create-schema,测试的schema,MySQL中schema也就是database
-concurrency,并发数
--engines,测试引擎,可以有多个,用分隔符隔开。
--iterations,迭代的实验次数
--socket,socket,文件位置
--debug-info,打印内存和CPU的信息
--only-print,只打印测试语句而不实际执行
--auto-generate-sql,自动产生测试SQL
--auto-generate-sql-load-type,测试SQL的类型。类型有mixed,update,write,key,read。
--number-of-queries,执行的SQL总数量
–number-int-cols,表内int列的数量
--number-char-cols,表内char列的数量
--query=name,使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
mysqlslap -a -concurrency=50 --number-of-queries 300 -T -hlocalhost -uroot -p123
此处表示自动测试,mysql将自动创建数据库,自动insert以及读取,给出最终的查询结果,其查询结果可能如下:
Benchmark
        Running for engine myisam
        Average number of seconds to run all queries: 0.087 seconds
        Minimum number of seconds to run all queries: 0.087 seconds
        Maximum number of seconds to run all queries: 0.087 seconds
        Number of clients running queries: 200
        Average number of queries per client: 1
你也可以指定自己的SQL语句,使用很简单,这里就不举例了。注意下--(两个下划线)和-(一个下划线)这样的参数形式就可以了。例子以及展示了其用法。

转:用php说明char和varchar区别

大家在建表时可能经常会遇到类似char和varchar这类的字段类型选择。

如有以下数据结构:

工号 姓名 部门
———————–
1 张三 财务
2 李四 人事
3 王五 销售
……..

我们定义”姓名”为char(10)(静态)的时简单地用php代码表示:
简单地模拟底层数据存储链表$data
$col_num_len  =1;      //工号长度为1
$col_name_len=10;    //姓名长度为10
$col_unit_len   =4;     //部门长度为4
$col_len=$col_num_len+$col_name_len+$col_unit_len+3;         //表示每笔记录的总长度,包括3个分隔符
实现如下:
$data="1|张三      |财务|2|李四      |人事|3|王五      |销售|...";         //简单地模拟底层数据存储链表

阅读剩余部分...

    Page :
  1. 1
  2. 2