【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
11.尽可能使用NOT NULL
除非必要,否则尽可能保持字段NIOT NULL;
NULL需要额外的空间,并且在比较的时候程序会更复杂。
12.使用Prepared Statements
Prepared Statements很想存储过程,是一个中运行在后台的SQL语句集合。
好处:在安全性方面,他可以检查一下你绑定好的变量,这样可以保护程序不受到"SQL注入式"攻击(程序员很容易忘记去手动检查);在性能方面,当使用一个相同的查询的时候,你可以给Prepared Statements定义一些参数,而MSQL只会解析一次;另外,最新版本的MySQL在传输Prepared Statements是使用二进制形式,效率非常高。
例:
//创建prepared statement
if ($stmt = $mysqli ->prepare("SELECT username FROM user WHERE state=?")){
$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搜寻的会快一些,因为这些固定的长度是和容易计算下一个数据的偏移量的,所以读取自然会快一些。而如果字段长度是不固定的,那么。每次要找下一条的话,需要程序找到主键。
并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度会浪费一些空间,因为无论你用不用,他都是要分配空间的。
来源:oschina
链接:https://my.oschina.net/u/1771585/blog/779482