网站静态化与mysql优化

1、伪静态

1、正则表达式的回顾

1)要求取出练习的4个数字php

 

 

2)要求取出,形式为:xxx-yyy-xxx的数据html

 

 

 

 

正则中几个概念:java

子表达式:简单理解成用小括号括起的部分就是一个子表达式,mysql

捕获:把子表达式的内容,保存在内存。linux

反向引用:圆括号的内容被捕获后,能够在这个括号后被使用。ios

3)要求取出,形式为:xxx-yzy-xxx的数据c++

 

 

4)贪婪模式与非贪婪模式正则表达式

若是有U即换成非贪婪匹配。sql

贪婪:尽量的多匹配。编程

非贪婪:尽量的少匹配。

 

 

5)匹配中文

 

 

 

 

案例:结巴程序:

$str=”我我要要….学学php编编….”;

直接变成:我要学习php编程

提示:使用该函数来完成,preg_replace()

2、伪静态实现方式语法,详解。

 

主要是三个配置:

RewriteEngine  on

RewriteCond

RewriteRule

 

RewriteEngine  on  重写引擎开关,一旦开启,全部的重写条件都生效。

1RewriteCond  重写条件

RewriteCond  重写条件,当达到什么条件时,完成重写。

语法为:

RewriteCond  判断依据  条件表达式  [条件标志] 

判断依据可使用服务器变量。服务器能够获得一些特定信息 

 

条件表达式,能够为以下形式:

正则或特殊标识

-f   表示是一个文件。

-d   表示是一个目录

正则,正则表达式字符串。

条件标志: 

[OR] 条件间的或者关系,当出现多个条件时,默认为而且的关系,条件应该是或者的关系下,可使用OR来表示! 

[NC]条件不区分大小写。条件匹配时不区分大小写

[OR,NC] 

2RewriteRule :定义重写规则

RewriteRule :定义重写规则,哪一个地址应该被重写到哪一个目标地址。

语法:

RewriteRule 匹配地址   目标地址 [标识] 

匹配的地址:所请求的地址,可以使用正则匹配

目标地址: 所重写到的地址,可使用反向引用!$N表示正则匹配到的第N个子模式!

好比:RewriteRule   goods-id(\d+)\.html  goods.php?id=$1 

标志:

[NC] 不区分大小写

[QSA] 查询字符串追加,在目标地址已经具备get参数时,会将真实请求的get参数追后边。

3、入门案例:

若是访问的文件存在,则访问该文件,若不存在,则执行重写:

 

好比请求: www.demo.com/index.html    若是index.html 文件存在,则请求该文件,若是不存在执行重写规则。

实现步骤:

使用分布式文件来完成配置,在网站的根目录下面新建一个.htacccess的文件。

1)在www.demo.com网站根目录下面新建一个.htaccess的文件。

经过编辑器另存为的方式来创建该文件。

 

2)修改虚拟主机里面的配置。

 

3)在.htaccess文件里面的,具体的配置

 

4、伪静态在 ecshop里面的使用。

 

伪静态网址:http://www.myecshop.com/goods-36.html

重写到该地址:http://www.myecshop.com/goods.php?id=36

http://www.myecshop.com/goods.php?id=39    该地址的伪静态网址是:

http://www.myecshop.com/goods-39.html

 

重写规则应该如何写?

goods-(\d+).html       goods.php?id=$1

 

ecshop支持重写,把到商品详情页面的连接地址变成伪静态的。

 

 

具体的配置:

 

5、防盗链效果

1)什么是盗链,

原理图说明:

 

2)如何判断请求的来源,使用 referer头信息。

 

3)具体的配置,只容许本网站的页面来访问该图片,

 

 

 

 

也能够把请求的图片重写到一个警示图片,

 

效果以下:

 

 

伪静态经常使用:把html地址,重写成php地址。

6[QSA]

[QSA] 查询字符串追加,在目标地址已经具备get参数时,会将真实请求的get参数追后边。

123.php代码:

 

在重写规则里面没有带[QSA]

 

效果以下:

 

 

在重写规则里面添加[QSA]

 

 

效果以下:

 

 

2、 mysql优化

1、优化概述

设计角度:存储引擎的选择,字段类型选择,范式

利用mysql自身的特性:索引,查询缓存,分区分表,存储过程,sql语句优化配置,

部署大负载架构体系:主从复制(读写分离)

硬件升级:

2、分析须要优化的语句 

要分析的sql语句是执行速度比较慢的。查找执行速度比较慢的sql语句。找到后,具体分析。

1)慢查询日志

是一种mysql提供的日志,记录全部执行时间超过某个时间界限的sql的语句。这个时间界限,咱们能够指定。在mysql中默认没有开启慢查询,即便开启了,只会记录执行的sql语句超过10秒的语句。

如何开启慢查询日志:

打开mysql的配置文件,window下是:my.ini    linux系统下是my.cnf

 

 

  注意: 修改完成后,要重启mysql

测试慢查询日志是否记录超过0.5秒的sql 语句。

benchmark(count,expr)函数能够测试执行count次expr操做须要的时间。

 

查看慢查询日志里面记录的sql语句的状况。

 

mysql的客户端进行查看慢查询日志的时间界限

 

也能够更改该时间界限,只对当前会话有效。

 

 

2mysql里面的profiles机制,

该机制可以精确的记录执行sql语句的时间,能精确到小数点后8

开启方式:直接在 mysql的客户端进行开启

set profiling=1|0(开启和关闭)

 

查看记录的时间:

show profiles

 

注意:不适应时,最好将其关闭

 

phpmysql的客户端,php代码如何实现,

//开启

$sql=”set profiling=1”;

mysql_query($sql);

//查询

$sql=”show profiles”;

mysql_query($sql);

 

一个sql语句执行比较慢,大多数的缘由是没有用到索引,

 

 

 

3mysql里面的索引,

索引的做用:是用于快速定位实际数据位置的一种机制。

索引在mysql中,是独立于数据的一种特殊的数据结构。

1)索引的分类: 

普通索引: 

利用特定的关键字,标识数据记录的位置(磁盘上的位置,盘号,柱面,扇面,磁道)。 

惟一索引: 

限制索引的关键字不能重复的索引。 

主键索引: 

限制索引的关键字不能重复,而且不能为NULL。(不能为NULL的惟一索引)。一个表中只容许有一个主索引。 

全文索引:

索引的关键字,不是某个字段的值,而是字段值中有意义的词来做为关键字创建索引。

复合索引,若是一个索引(以上四种任何均可以),是依赖于多个字段建立的化,称之为复合索引。

一个myisam表的对应的三个文件,表结构文件.frm   数据文件.myd  索引文件.myi

 

 

添加一个普通索引后,索引文件会变大,

 

 

 

2)索引的建立

第一种方式,在建立表时,一块建立索引。

 

第二种方式:建完表后,以alter方式创建索引。

 

 

3)索引的删除,

删除主键索引:alter table   tablename   drop primary key  

在删除主键索引时,要注意是否有auto_increment属性,若是有,则先要删除该属性,才能删除主键索引。

删除其余索引:alter table  tablename   drop index 索引的名字 

注意:若是没有指定索引的名字则是使用该字段名称做为索引的名字的。

 

 

4)索引的查看

show indexes from table_name; 

show index from table_name 

show create table table_name 

show keys from table_name 

desc table_name 

4、建立索引的注意事项 

(1)较频繁的做为查询条件字段应该建立索引

select * from emp where empno = 1 

2)惟一性太差的字段不适合单首创建索引,即便频繁做为查询条件

select * from emp where sex = '男‘ 

好比: is_best  is_new   is_hot    is_sale   is_delete 

3)更新很是频繁的字段不适合建立索引

select * from emp where logincount = 1 

 好比登陆的状态,

4)不会出如今WHERE子句中字段不应建立索 

 

5、索引的数据结构

1myisam引擎的索引

索引的节点中存储的是数据的物理地址(磁道和扇区)

在查找数据时,查找到索引后,根据索引节点中的物理地址,查找到具体的数据内容 

 

2innodb的索引的数据结构

innodb的主键索引文件上 直接存放该行数据,称为聚簇索引,非主索引指向对主键的引用

myisam中, 主索引和非主索引,都指向物理行(磁盘位置).

 

注意: innodb来讲, 

1: 主键索引 既存储索引值,又在叶子中存储行的数据

2: 若是没有主键, 则会Unique key作主键 

3: 若是没有unique,则系统生成一个内部的rowid作主键. 

4: 像innodb中,主键的索引结构中,既存储了主键值,又存储了行数据,这种结构称为”聚簇索引” 

先建立一个 myisam引擎的表,并插入数据

create table t5(

    id int primary key auto_increment,

    name varchar(12) not null  comment '名称'

)engine myisam charset utf8;

 

说明:mysiam引擎的表的数据是按照插入的顺序显示的。

再建立一个inodb引擎的表,并插入数据

create table t6(

    id int primary key auto_increment,

    name varchar(12) not null  comment '名称'

)engine innodb charset utf8;

 

说明:innodb引擎的表的数据是按照主键的顺序插入的。

 

6explain(执行计划)工具使用 

 

主要用于分析sql语句的执行状况(并不执行sql语句)获得sql语句是否使用了索引,使用了哪些索引。 

语法:explain  sql语句\G   或 desc sql语句\G 

在mysql以前的版本中,explain只支持select语句,可是在最新的5.6版本中,它支持 explain update/delete了。 

 

 

作实验建立几张表:

create table user( 

    id int primary key auto_increment, 

    name varchar(32) not null default '', 

    age tinyint unsigned not null default 0, 

    email varchar(32) not null default '', 

    classid int not null default 1 

)engine myisam charset utf8; 

insert into user values(null,'xiaogang',12,'gang@sohu.com',4), 

(null,'xiaohong',13,'hong@sohu.com',2), 

(null,'xiaolong',31,'long@sohu.com',2), 

(null,'xiaofeng',22,'feng@sohu.com',3), 

(null,'xiaogui',42,'gui@sohu.com',3); 

建立一个班级表:

create table class( 

    id int not null default 0, 

    classname varchar(32) not null default '' 

)engine myisam charset utf8; 

insert into class values(1,'java'),(2,'.net'),(3,'php'),(4,'c++'),(5,'ios'); 

1)语法分析:

explain  sql语句:

 

select_type:SIMPLE

表示查询的类型,此处是一个简单的查询

table :user;

表示要查询的表。

type列:是指查询的方式,很是重要,是分析“查数据过程”的重要依据。 

可能的值:all   index   range   ref    const 

possible_key:可能用到的索引

注意:系统估计可能用的几个索引,但最终,只能用1个。 

key:最终用的索引。 

key_len:使用的索引的最大长度。 

rows:是指估计要扫描多少行。 

extra: 

using index :是指用到了索引覆盖,效率很是高 

using where:是指光靠索引定位不了,还得where判断一下。 

using temporary:是指用上了临时表,group by 与order by不一样列时,或grop by,order by 别的表的列。 

using filesort:文件排序(文件可能在磁盘,也可能在内存)

 

 

2)分析type列的值。

 all:是扫描全部的数据行,性能最差,通常是没有添加索引,或没有使用到索引,

 

index:比all性能稍好一点,是指要扫描全部的索引节点。

 

出现index, 则说明只在索引文件中查找。 

(1)索引覆盖的查询状况下,能利用上索引,可是又必须全索引扫描。 

(2)是利用索引来排序,但只能取出索引的列。 

range:意思是查询时,能根据索引作范围扫描。 

 

 

ref:是指,经过索引列,能够直接引用到某些数据行。

 

const,system,null这3个分别指查询优化到常量级别,甚至不须要查找时间。

通常按照主键来查询时,易出现 const,system 

或者直接查询某个表达式,不通过表时,出现null. 

相关文章
相关标签/搜索