数据库优化是PHP面试几乎都会被问到的事情,也是咱们工做中应该注意的事情,固然,若是是小网站无所谓优化不优化,网站访问量大了天然会暴漏数据库的瓶颈,这个瓶颈是各方面问题综合致使的,下面咱们来作下数据库优化的总结。
一:对数据库优化
1.建立索引
对于查询占主要的应用来讲,索引显得尤其重要。不少时候性能问题很简单的就是由于咱们忘了添加索引而形成的,或者说没有添加更为有效的索引致使。若是不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,若是一张表的数据量很大而符合条件的结果又不多,那么不加索引会引发致命的性能降低。
2.选取最适用的字段属性
MySQL能够很好的支持大数据量的存取,可是通常说来,数据库中的表越小,在它上面执行的查询也就会越快。所以,在建立表的时候,为了得到更好的性能,咱们能够将表中字段的宽度设得尽量小。
A、数据类型尽可能用数字型,数字型的比较比字符型的快不少。
B、 数据类型尽可能小,这里的尽可能小是指在知足能够预见的将来需求的前提下的。
C、 尽可能不要容许NULL,除非必要,能够用NOT NULL+DEFAULT代替。
D、少用TEXT和IMAGE,二进制字段的读写是比较慢的,并且,读取的方法也很少,大部分状况下最好不用。
E、 自增字段要慎用,不利于数据迁移
3.设计规范化表,消除数据冗余
4.适当的冗余,增长计算列
知足范式的表必定是规范化的表,但不必定是最佳的设计。不少状况下会为了提升数据库的运行效率,经常须要下降范式标准:适当增长冗余,达到以空间换时间的目的。
二:对代码优化
1.开启查询缓存
大多数的MySQL服务器都开启了查询缓存。这是提升性最有效的方法之一,并且这是被MySQL的数据库引擎处理的。当有不少相同的查询被执行了屡次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操做表而直接访问缓存结果了。
这里最主要的问题是,对于程序员来讲,这个事情是很容易被忽略的。由于,咱们某些查询语句会让MySQL不使用缓存。
/ 查询缓存不开启mysql
$r = mysql_query(“SELECT username FROM user WHERE signup_date >= CURDATE()”);程序员
// 开启查询缓存面试
$today = date(“Y-m-d”);sql
$r = mysql_query(“SELECT username FROM user WHERE signup_date >= ‘$today'”);数据库
上面两条SQL语句的差异就是 CURDATE() ,MySQL的查询缓存对这个函数不起做用。因此,像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,由于这些函数的返回是会不定的易变的。因此,你所须要的就是用一个变量来代替MySQL的函数,从而 开启缓存。 2.优化查询语句 统一SQL语句的写法,空格、大小写保持整站一致。 尽可能避免使用select *,返回无用的字段会下降查询效率。 不要把SQL语句写得太复杂,若是语句长能够将一个Select语句的结果做为子集,而后从该子集中再进行查询,这种一层嵌套语句仍是比较常见的,可是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划。 使用临时表暂存结果,简化SQL语句的重要方法就是采用临时表暂存中间结果,可是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这能够避免程序中屡次扫描主表,也大大减小了程序执行中“共享锁”阻塞“更新锁”,减小了阻塞,提升了并发性能。 尽可能避免使用in 和not in,会致使数据库引擎放弃索引进行全表扫描。 尽可能避免使用or,会致使数据库引擎放弃索引进行全表扫描。 尽可能避免进行null值的判断,会致使数据库引擎放弃索引进行全表扫描。 尽可能避免在where条件中等号的左侧进行表达式、函数操做,会致使数据库引擎放弃索引进行全表扫描。 减小跨库查询和大表链接操做(分割你的表,减少表尺寸)。 存储过程、视图、函数的适当使用。 三:对硬件优化 1.提高带宽 带宽越大,访问速度越快。 2.当数据足够快时,CPU可能出现瓶颈,增长cpu的核数或者cpu个数 3.I/O瓶颈通常发生在工做所需的数据远远超过有效内存容量时,这时候咱们就用SSD硬盘代替普通磁盘,增长服务器内存;
本人博客:从数据库、代码和服务器对PHP网站Mysql作性能优化