MySQL优化20条经验(二)

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搜寻的会快一些,由于这些固定的长度是和容易计算下一个数据的偏移量的,因此读取天然会快一些。而若是字段长度是不固定的,那么。每次要找下一条的话,须要程序找到主键。

    而且,固定长度的表也更容易被缓存和重建。不过,惟一的反作用是,固定长度会浪费一些空间,由于不管你用不用,他都是要分配空间的。

相关文章
相关标签/搜索