大型網站優化
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 mediuint:0-1千6百萬 int:0-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 一般使用不上索引的時候出現