Mysql 數據庫優化技術隨筆

大型網站優化

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 一般使用不上索引的時候出現


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章