大型网站优化

1.页面静态化:

a) 将动态处理的数据保存为一个静态的HTML文本,下次访问的时候直接返回这个静态的HTML文本,不需要动态的处理(1. php处理 2. php处理数据库里面的数据),可以简单的理解为这个HTML文本就是一个缓存文件。

b) 使用技术点:ob缓存来实现。ob缓存(outputting buffer:输出缓冲)

2.memcache缓存

memcache是一个nosql(非关系型数据)的产品

i. 不在遵循严格的表结构的概念,主要以 key-value 键值对的存储方式来保存数据(php关联数组)array(name=asion,age=>12)

ii. 不在使用sql语句作为查询语句获取数据

iii. 一般来说不在支持关系型数据库的视图、事务、存储过程

3.mysql优化

为什么要做mysql数据库优化?

答:

1. 最先使用页面静态化技术,可以将动态的数据缓存为静态的html文本,以加快访问的速度。不能所有的动态数据全部的静态化。有一部分的数据肯定要查询数据库获取。

2. 在从数据库获取数据的时候,为了减少数据库的压力,又使用memcache缓存来减少mysql的压力。但是最终还是有数据要去mysql服务器里面查询处理。

通过上面的优化,发现最终有一部分的数据还是要从mysql里面产生(好比登录信息,用户的状态是否被锁定,实时去查询数据库获取)。这个时候就有必要对mysql本身来做数据的


从哪些方面来优化mysql数据库?

答:

1.建表:字段类型,存储引擎,三范式(mysql来说,一般都满足):减少数据的冗余

2.mysql自身:mysql的索引、mysql自身缓存

3.架构:mysql读写分离

4.经验:合理sql、存储过程

思路:

a) mysql存储引擎的选择(myisam\innodb

b) 字段类型选择(tinyint:0-255 mediuint0-16百万  int0-42亿)char(32) not null

c) mysql索引:主键索引、唯一索引、普通索引、全文索引(myisam 英文、替代的解决方案使用sphinx(英文和俄文)---coreseek:中文版的sphinx

    d) mysql架构方面:读写分离技术,一般类型的网站都有一个读写的比例分配,并且读的情况相对来说多一些(可以使用多台mysql服务器完成读的操作,使用一台mysql写服务器完成数据的插入更新)

问题:由于只在写服务器上完成数据的插入更新删除、并没有在读服务器上完成数据的插入更新和删除。数据一致性如何解决?

解决方案:主从复制,可以实现在写服务器上完成数据的插入更新删除后,读服务器上可以同步的将数据迁移过来,以便于完成数据一致性,供用户查询

二、什么是存储引擎?

答:mysql按照一定的数据格式来保存最终的数据。不同的存储引擎保存的数据格式是不一样的。我们实际使用最多的存储引擎有两类:myisam和innodb。

大型网站带来的问题:

1. 高并发的问题

a) 1s(同时)内,所有访问用户的总和,好比小米手机抢购的那一瞬间

2. 流量的问题

a) 带宽更大

3. 海量数据检索变慢的问题,用户访问时长很长

a) 用户体验不好

解决办法:

    1.负载均衡

    2.memcache缓存

     3.加高可用


三、myisam和innodb存储数据的形式

myisam 使用三个文件:表的结构、数据、索引

Innodb 使用二个文件:表的结构、表的空间(数据+索引)


小命令:

show engines\G --查看储存引擎

mysql 默认是innodb

engines = myisam default

engines = innodb default


四、字段类型的介绍

整型:

tinyint : 0 --255 适用场合:男女、状态

samllint:0--65535 适用场合:后台的管理员表主键字段

mediumint:0--1千6百万 适用场合:商品表主键字段

int:0--42亿:很少很少使用

注意:mysql数据库在处理数据达到千万级别左右的时候,性能会急剧下降。并且mysql官方也不建议使用int这种类型。

php里面如果需要保存时间信息,可以在建表的时候使用int的字段类型。(时间戳)

字符类型:

varchar 0-65535 使用场合:数据长度不是很大,但是又不确定,例如姓名、住址、邮箱

char 0-255 使用场合:常见主要md5加密后的密码字段 char(32)

decimal(10,2) 10位数字,两个小数点的精度 使用场合:主要是保存价格

text 使用场合:主要适合保存大段内容 文章、新闻的详情

注意:对应myisam存储引擎的text才能使用全文索引(英文)


五、三范式处理介绍

如果要设计一个 1:N 的场合,这个时候可以单独的垂直方向把原先的表进行切分。


例如:设计一张留言表

第一种方案:增加多个新的字段来保存留言

留言表:mes_id、user_id、message1、message2、message3......

第二种方案:单独建立一个字段,使用一定的分隔符(&&&)来保存多条浏览信息

第三种方案:单独设计一张表,来保存用户的留言。


六、mysql的索引

一般在做mysql查询的时候,mysql会去检测查询sql语句后面的where条件里面的字段是否有索引,如果有索引,则把对应的字段的索引载入到内存里面。根据这个索引快速的定位数据,把数据取出。如果没有索引,则要做全表扫描的操作


mysql里面的索引分类

mysql里面常见的索引有以下四类,其他的三类不怎么用:

1.主键索引:一张表只有一个主键(primary key(id,name)),可以将多个字段组合建立出一个主键索引,也可以只为单个建立。主要是为对数据进行约束,防止数据重复。并且如果某个字段建立了主键索引,这个字段里面的数据唯一,并且不能为null。同时还需要注意的是,如果这个字段自增,则必须要设置为主键;但是主键并不一定自增。(primary key(NAME))


2.唯一索引: 一张表里面可以建立多个,字段里面允许出现null,但是不能重复。从某种程度上来说和主键索引基本等同。(unique)


3.普通索引: 一张表可以建立很多个,没有限制;但是需要注意的是,索引在查询方面有很好的用处,在数据添加更新方面有弊端的(索引必须全部的重建,需要消耗服务器的性能)。索引不是越多越好。所以在建立索引的时候合理即可。不要过多。


4.全文索引:支持myisam存储引擎,同时只支持英文;目前使用的很少,都是使用sphinx来替代的。

索引的管理

索引的管理主要是对索引的增删改查操作;

1.主键索引的建立(建表的时候完成)

primary key(id);

2.查看表结构

desc 表;

show index from 表\G

3.如果创建表前没建立主键索引,添加

alter table 表 add primary key(id);

4.普通索引的创建

alter table 表 add key(name);

5.主键索引的删除:

先删除只增长再删除主键

6.唯一索引的删除

alter table 表 drop 唯一索引的字段名


开启mysql的慢查询功能

修改mysql的配置文件my.ini

214行左右:

log-slow-queries='slow-log.txt'

long-query-time =1

慢查询日志默认是保存在mysql的data目录的slow-log.txt

mysql提供的慢查询日志功能只能记录时间精度为1s以上的。这个时候如果要记录精度小于1s的sql语句,慢查询日志无法完成,如何解决?


答:可以使用mysql提供的另外一个功能:profile功能


profile测试工具:

查看profile是否开启

show variables like '%prof%';

开启profile工具

set profiling =1;

使用profile分析

show profiles


 explain工具分析sql语句执行的流程:

使用:在查询sql语句前面加上关键字 explain 或者 desc 关键字

例如:explain select * from it_news;

例如:desc select * from it_news;


执行计划的 type 列分析

这一列的常见值有:

const、all、range、system、index

最好的是  system , 一般在表中只有一行记录的或者查询系统表的时候出现。

其次就是 const 一般在使用主键索引的时候会出现。 

其其次range 一般在做范围查询的时候会使用 id < 100。

index代表可以使用索引做一些优化,一般在查询表的总行数的时候出现。 

all 一般使用不上索引的时候出现