澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:代码和服务器对PHP网站

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

一:对数据库优化

1.创建索引

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

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

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

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

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

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

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

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

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

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

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

二:对代码优化

1.开启查询缓存

大多数的MySQL服务器都开启了查询缓存。这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。
 这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。
  1. 1. 优化你的MySQL查询缓存 在MySQL服务器上实行查询,能够启用高速查询缓存。让数据库引擎在后台悄悄的拍卖是巩固质量的最管用方法之大器晚成。当同叁个询问被实行多次时,假如结果是从缓存中领到,那是后生可畏对后生可畏快的。
    但首要的难点是,它是那么轻巧被隐形起来直到大家大部分技师会忽视它。在某些管理职责中,我们实际是足以阻碍查询缓存工作的。
    1. // query cache does NOT work
    2. $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
    3. // query cache works!
    4. $today = date("Y-m-d");
    5. $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");
    6. // query cache does NOT work
    7. $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");
    8. // query cache works!
    9. $today = date("Y-m-d");
    10. $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");
  2. 2 2. 用EXPLAIN令你的SELECT查询特别清晰 使用EXPLAIN关键字是另三个MySQL优化能力,能够让您询问MySQL正在拓宽怎样的查询操作,那足以援救您发觉瓶颈的大街小巷,并体现出查询或表结构在哪儿出了难题。
    EXPLAIN查询的结果,能够告知您那叁个索引正在被引述,表是哪些被围观和排序的等等。
    达成多少个SELECT查询(最佳是比较复杂的八个,带joins格局的卡塔尔,在里头加多上你的主要词解释,在这里处我们得以运用phpMyAdmin,他会告诉 你表中的结果。譬世尊讲,要是当自家在实践joins时,正忘记往二个目录中增添列,EXPLAIN能扶助小编找到难点的四处。
    增多索引到group_id field后
      澳门新浦京娱乐场网站 1

    澳门新浦京娱乐场网站 2

  3. 3 3. 运用LIMIT 1得到唯大器晚成行 有的时候,当您要询问一张表是,你明白自个儿只必要看生龙活虎行。你大概会去的一条特别不相同平常的笔录,大概只是适逢其时检查了别的部存款和储蓄器在的记录数,他们都满足了您的WHERE子句。
    在这里种情形下,增添一个LIMIT 1会令你的查询特别可行。那样数据库引擎发掘唯有1后将告风流倜傥段落扫描,并不是去扫描整个表或索引。

    1. // do I have any users from Alabama?
    2. // what NOT to do:
    3. $r = mysql_query("SELECT * FROM user WHERE state = 'Alabama'");
    4. if (mysql_num_rows($r) > 0) {
    5. // ...
    6. }
    7. // much better:
    8. $r = mysql_query("SELECT 1 FROM user WHERE state = 'Alabama' LIMIT 1");
    9. if (mysql_num_rows($r) > 0) {
    10. // ...
    11. }
  4. 4 4. 索引中的检索字段 目录不唯有是主键或唯黄金年代键。如果你想寻找表中的任何列,你应当一贯指向索引。 澳门新浦京娱乐场网站 3

  5. 5 5. 承保连接的目录是均等的项目 假使应用程序中含有八个一而再连续查询,你须要确认保证您链接的列在两侧的表上都被索引。这会影响MySQL怎么样优化内部联接操作。
    其余,加入的列,必得是如出风流浪漫辙品种。举例,你投入三个DECTiggoIDE福特ExplorerL列,而还要走入另多少个表中的int列,MySQL将不能够使用此中起码一个目标。固然字符编码必得同为字符串类型。

    1. 澳门新浦京娱乐场网站:代码和服务器对PHP网站Mysql做性能优化,mysql数据库优化总结。// looking for companies in my state
    2. $r = mysql_query("SELECT company_name FROM users
    3. LEFT JOIN companies ON (users.state = companies.state)
    4. WHERE users.id = $user_id");
    5. // both state columns should be indexed
    6. // and they both should be the same type and character encoding
    7. // or MySQL might do full table scans
  6. 6 6. 并非选拔BY RAND()命令 那是三个令好多生手程序猿会掉进去的牢笼。你或然无心中创立了一个可怕的恬静。那一个陷阱在您是用BY RAND(卡塔尔国命令时就从头创办了。
    若是您真的要求自由呈现你的结果,有好多更加好的不二等秘书技去得以完毕。诚然那亟需写越来越多的代码,可是能防止品质瓶颈的面世。难点在于,MySQL大概会为表中每三个独自的行施行BY RAND()命令(那会消耗微型机的管理技艺卡塔尔国,然后给您独自重返豆蔻梢头行。
    1. // what NOT to do:
    2. $r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");
    3. // much better:
    4. $r = mysql_query("SELECT count(*) FROM user");
    5. $d = mysql_fetch_row($r);
    6. $rand = mt_rand(0,$d[0] - 1);
    7. $r = mysql_query("SELECT username FROM user LIMIT $rand, 1");
  7. 7 7. 尽量制止SELECT *命令 从表中读取越来越多的数量,查询会变得越来越慢。他扩充了磁盘必要操作的时刻,依旧在数据库服务器与WEB服务器是独立分开的动静下。你将会经验比较久远的网络延迟,仅仅是因为数量无需的在服务器之间传输。
    一向钦赐你要求的列,这是多个不行了不起的习贯。
    1. // not preferred
    2. $r = mysql_query("SELECT * FROM user WHERE user_id = 1");
    3. $d = mysql_fetch_assoc($r);
    4. echo "Welcome {$d['username']}";
    5. // better:
    6. $r = mysql_query("SELECT username FROM user WHERE user_id = 1");
    7. $d = mysql_fetch_assoc($r);
    8. echo "Welcome {$d['username']}";
    9. // the differences are more significant with bigger result sets
  8. 8 8. 从PROCEDURE ANALYSE()中拿走建议 PROCEDURE ANALYSE()可让MySQL的柱结构解析和表中的其实数目来给你有的提议。假诺您的表中已经存在实际数据了,能为你的首要决策服务。
    澳门新浦京娱乐场网站 4

  9. 9 9. 准备好的说话 预备好的言语,能够从质量优化和龙鹄山两地方对大家全体助于。
    预备好的语句在过滤已经绑定的变量暗中认可情状下,能给应用程序以平价的珍视,防止SQL注入攻击。当然你也得以手动过滤,不过是因为大多数程序猿关节炎的心性,很难达到效果。

    1. // create a prepared statement
    2. if ($stmt = $mysqli->prepare("SELECT username FROM user WHERE state=?")) {
    3. // bind parameters
    4. $stmt->bind_param("s", $state);
    5. // execute
    6. $stmt->execute();
    7. // bind result variables
    8. $stmt->bind_result($username);
    9. // fetch value
    10. $stmt->fetch();
    11. printf("%s is from %sn", $username, $state);
    12. $stmt->close();
    13. }
  10. 10 10. 将IP地址存款和储蓄为无符号整型 过多程序猿在开立叁个VARCHA景逸SUV(15卡塔 尔(阿拉伯语:قطر‎时并从未发觉到他俩得以将IP地址以偏分头情势来积累。当你有一个INT类型时,你只占用4个字节的上空,那是一个稳住大小的园地。
    你必得明确你所操作的列是二个UNSIGNED INT类型的,因为IP地址将选取三拾三位unsigned integer。
    1. $r = "UPDATE users SET ip = INET_ATON('{$_澳门新浦京娱乐场网站,SERVER['REMOTE_ADDR']}') WHERE user_id = $user_id";
      十大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做性能优化

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站:代码和服务器对PHP网站