11.尽量使用NOT NULLmysql
除非必要,不然尽量保持字段NIOT NULL;程序员
NULL须要额外的空间,而且在比较的时候程序会更复杂。sql
12.使用Prepared Statements缓存
Prepared Statements很想存储过程,是一个中运行在后台的SQL语句集合。安全
好处:在安全性方面,他能够检查一下你绑定好的变量,这样能够保护程序不受到"SQL注入式"攻击(程序员很容易忘记去手动检查);在性能方面,当使用一个相同的查询的时候,你能够给Prepared Statements定义一些参数,而MSQL只会解析一次;另外,最新版本的MySQL在传输Prepared Statements是使用二进制形式,效率很是高。函数
例:性能
//建立prepared statementfetch
if ($stmt = $mysqli ->prepare("SELECT username FROM user WHERE state=?")){ip
$stmt ->bind_param("s",$state); //绑定参数内存
$stmt ->execute(); //执行
$stmt ->bind_result($username); //绑定结果
$stmt ->fetch(); //移动游标
printf("$s is from %s\n",$username,$state);
$stmt ->close();
}
13.无缓冲查询
正常状况下,当你的脚本中执行一个SQL语句的时候,你的程序会停在那里知道没有这个SQL返回,而后你的 程勋再回继续往下执行。咱们能够使用无缓冲查询(mysql_unbuffered_query()函数)来改变这个行为。
myql_unbuffered_query()发送一个SQL语句到MySQL而并不像mysql_query()同样去自动fetch和缓存结构。这样会节省不少可观的内存,尤为是那些会产生大量的查询语句,而且,不须要等到全部的结果返回,只须要第一行的结果返回到时候,就立刻能够开始工做于查询结果了。
然而,这样会有一些限制。由于你要么把全部的行都读走,或者在下一次查询以前调用mysql_free_query()清除结果。并且,mysql_num_rows()或mysql_data_seek()将没法使用。
14.将IP地址存成UNSIGNED INT
IP原本应该是字符串类型;但若是用整形来存放,只须要4个字节,而且这样有固定的长度。并且,这样会带来查询上的优点,尤为是当你使用这养的WHERE条件:IP between ip1 and ip2。
必须使用UNSIGNED INT,由于IP地址会使用整个的32位无符号整形。
而你的查询,你能够使用INET_ATON()来把一个字符串IP转成一个整形,并使用INET_NTOA()把一个整形转成一个字符串IP.在PHP中,也有这样的函数ip2long()和long2ip()。
15.固定长度的表会更快
若是全部字段都是固定长度的,整个表都会被认为是“static”或“fixed-length”。例如,若是你的表中没有如下字段:VARCHAR,TEXT,BLOB。只要包含了其中一个其中一个这些字段,那么这个表就不是“固定长度静态表”了,此时,MySQL引擎会用另外一种方法来处理。
固定长度的表会提升性能,由于MySQL搜寻的会快一些,由于这些固定的长度是和容易计算下一个数据的偏移量的,因此读取天然会快一些。而若是字段长度是不固定的,那么。每次要找下一条的话,须要程序找到主键。
而且,固定长度的表也更容易被缓存和重建。不过,惟一的反作用是,固定长度会浪费一些空间,由于不管你用不用,他都是要分配空间的。