MySQL优化20条经验(二)

强颜欢笑 提交于 2019-12-14 11:57:59

【推荐】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搜寻的会快一些,因为这些固定的长度是和容易计算下一个数据的偏移量的,所以读取自然会快一些。而如果字段长度是不固定的,那么。每次要找下一条的话,需要程序找到主键。

    并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度会浪费一些空间,因为无论你用不用,他都是要分配空间的。

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!