網站靜態化與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. 

相關文章
相關標籤/搜索