从数据库、代码和服务器对PHP网站Mysql做性能优化

从数据库、代码和服务器对PHP网站Mysql做性能优化

 

数据库优化是PHP面试几乎都会被问到的事情,也是我们工作中应该注意的事情,当然,如果是小网站无所谓优化不优化,网站访问量大了自然会暴漏数据库的瓶颈,这个瓶颈是各方面问题综合导致的,下面我们来做下数据库优化的总结。

一:对数据库优化

1.创建索引

对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。

2.选取最适用的字段属性

MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。

A、数据类型尽量用数字型,数字型的比较比字符型的快很多。

B、 数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的。

C、 尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替。

D、少用TEXT和IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。

E、 自增字段要慎用,不利于数据迁移

3.设计规范化表,消除数据冗余

4.适当的冗余,增加计算列

满足范式的表一定是规范化的表,但不一定是最佳的设计。很多情况下会为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

二:对代码优化

1.开启查询缓存

大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。
 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。


/ 查询缓存不开启

$r = mysql_query(“SELECT username FROM user WHERE signup_date >= CURDATE()”);

// 开启查询缓存

$today = date(“Y-m-d”);

$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做性能优化
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114311.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • JAVA位移运算「建议收藏」

    JAVA位移运算「建议收藏」1、java将负整数转成二进制这里以8位为例,只是为了表明过程,实际中java的int类型是4byte,也就是32位。二进制的首位是符号位,0表示正数,1表示负数,在java中,会对负数进行取反加一操作,进而计算出实际的十进制值。如10101010,此8位的二进制数首位是1,表示负数,所以对后面的七位进行取反加一操作,即0101010–>1010110,换成十进制的数就是86,再加上首位的1表示负数,结果就是-86。2、位移运算1)正数的右移:如10>>2,左边自动补0,右边移出

  • Java中的锁

    Java中的锁在学习或者使用Java的过程中进程会遇到各种各样的锁的概念:公平锁、非公平锁、自旋锁、可重入锁、偏向锁、轻量级锁、重量级锁、读写锁、互斥锁等待。这里整理了Java中的各种锁,若有不足之处希望大家在下方留言探讨。WARNING:本文适合有一定JAVA基础的同学阅读。公平锁和非公平锁公平锁是指多个线程在等待同一个锁时,必须按照申请锁的先后顺序来一次获得锁。公平锁的好处是等待锁的线程…

  • django修改数据_django-vue-admin

    django修改数据_django-vue-admin前言在ORM框架中,所有模型相关的操作,比如添加/删除等。其实都是映射到数据库中一条数据的操作。因此模型操作也就是数据库表中数据的操作。添加一个模型到数据库中:添加模型到数据库中。首先需要创建一

  • Vue生成二维码_视频生成二维码软件

    Vue生成二维码_视频生成二维码软件vue有两种生成二维码的方式,qrcode、vue-qr(有icon);

  • Mac 下IDEA无法启动的问题的解决

    Mac 下IDEA无法启动的问题的解决

  • C语言 条件运算符(? : )的用法[通俗易懂]

    C语言 条件运算符(? : )的用法[通俗易懂]条件运算符(?:)是一个三目运算符,即有三个操作数。使用条件运算符(?:)可以实现IfElse的功能,其一般形式为:          表达式1?表达式2:表达式3其意思是:如果表达式1为真,则运算表达式2,整个条件表达式的值为表达式2的值;反之,则运算表达式3,整个条件表达式的值为表达式3的值。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号