网站静态化与mysql优化

一、伪静态

1、正则表达式的回顾

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

 

 

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

 

 

 

 

正则中几个概念:

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

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

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

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

 

 

4)贪婪模式与非贪婪模式

如果有U即换成非贪婪匹配。

贪婪:尽可能的多匹配。

非贪婪:尽可能的少匹配。

 

 

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]

 

 

效果如下:

 

 

二、 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. 

 

转载于:https://www.cnblogs.com/zqsyr/p/4976305.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值