php的訪問流程
瀏覽器 =>web服務器=>後端腳本(php)=>數據庫(mysql)php
網站優化的的幾點
一.①提升併發量 負載均衡(分佈式服務器架構) 併發量更高的軟件(nginx)
一.② 頁面靜態化 不常常發生數據變更的動態網頁生成靜態網頁,提升訪問速度
一.③內存緩存優化 把數據緩存到內存中,提升數據響應速度
一.④數據庫優化
通常數據讀寫頻繁,能夠緩存到內存中。可是內存容量有限,不可以把大量數據緩存,全部優化數據庫軟件自己是頗有必要的。mysql
現實中④數據庫優化更實際(多)
那麼咱們如何實際優化數據庫mysq呢
①存儲層 存儲引擎 列類型選擇 範式(三範式)
② 設計層 索引 緩存 分區表
③ sql層 使用執行效率高的sql語句,explain執行計劃,慢查詢日誌記錄
④架構層 分佈式數據庫架構 使用多臺數據庫服務器,解決數據庫訪問併發的問題,
主從複製 從服務器複製主服務器數據
存儲引擎 myisam和innodb這兩種最經常使用nginx
myisam和innodb的區別
①myisam的結構數據,索引的的物理文件
.frm 結構文件 .MYD數據文件 .MYI索引文件
② 數據存儲順序 當插入當存儲引擎爲myisam的存儲引擎 存儲順序是插入順序 ,沒有進行排序操做
③ 功能 複製備份 壓縮機制
myisam數據表生成文件有三個,若是進行數據備份,直接複製粘貼三個文件便可。myisam數據壓縮 壓縮機制:數據表進行壓縮,節省存儲空間,提升查詢速度
語法
myisampack tablename路徑 壓縮
myisamchk –unpack tablename路徑 解壓
myisamchk -rq tablename路徑 從新生成索引
④併發性 表級鎖 (併發寫入)
myisam 表級鎖,鎖表會影響整個表的操做,併發性稍微遜色
innodb 存儲引擎
innodb全部的數據和索引文件在一個文件裏,能夠在建立表時候進行分離
臨時設置分離
先查看 mysql> show variables like ‘innodb_file_per_table’;
開啓 mysql> set global innodb_file_per_table =1;
開啓後,分爲結構文件 和 數據索引文件
數據主鍵順序存儲
innodb支持事務 外鍵 myisam不支持事務和外鍵
事務:保證數據的一致性,原子性
外鍵:一種約束,規則
innodb併發性:擅長併發web
那麼現實中如何選擇數據庫中這兩種經常使用的存儲引擎呢?
①通常使用 普通讀寫較多的,備份恢復方便,壓縮機制 選用myisam
好比 cms(內容管理系統,快速搭建網站) 好比二次開發的dedecms建站系統
②併發寫入 (行鎖) 事務 外鍵 innodb
好比:訂單系統sql
#
固然mysql並不僅有這兩種存儲引擎
好比其它的存儲引擎
①memory 數據至於內存的存儲引擎,擁有極高的插入,更新和查詢效率,可是會佔用和數據量成正比的內存空間,而且其內容在mysql從新啓動時會丟失,不支持text類型數據庫
列類型選擇
整型 int
字符串 文本類型 char varchar text
選用 好比 人類年齡 選用 tinyint
內容長度固定字段
char 定長255字符
varchar 變長 65535字節
如何數據不定長,使用varchar會更節省空間,若是追求查詢效率,就須要使用char
整型:儘可能使用可以整型存儲數據
時間戳使用
使用int類型存儲,節省空間,時間範圍更好計算肯定
mysql中時間戳相關函數
unix_timestamp() 當前時間戳的信息
from_unixtime() 讀取一個時間戳信息
ip存儲使用
mysql函數 :inet_atom inet_ntoa()
php函數 ip2long() long2ip()後端
範式是一種規範或者約束。設計數據庫表是符合規範的,就被認爲是良好的數據表設計
三範式
第一範式 數據字段具備原子性,業務上不可再分割。
第二範式 數據具備惟一性(主鍵id)。
第三範式 數據字段和主鍵具備緊密聯繫,不容許出現冗餘(rong[重複])字段
三範式 :一環一環知足
1NF<2NF<3NF
逆反式
真實業務的環境,爲了可以實現更好的數據庫表的性能,會選擇不遵照範式的操做。
遵照第三範式,查詢數據,須要連表操做,若是數據表數據不少,連表操做,會耗費大量時間。爲了提升查詢效率。能夠選擇把數據字段存儲到同一個表中。瀏覽器
創建了冗餘字段以後,必定要注意維護數據的一致性。緩存
索引 生活中實際索引舉栗子 —》—-》書的目錄 指引 公交站牌 辦公室指引牌
索引是一種數據結構(存儲數據的方式),存儲字段值的內容和對應真實數據的物理地址。
查詢數據經過索引查詢到物理地址,再經過物理地址直接定位數據。
索引是一種以空間換取時間的方式,犧牲了寫的速度,提升查詢速度。
alter table tablename add primary key(字段);
索引爲何這麼快?
創建索引以後,查詢變爲:
查詢字段=>索引=>物理地址=>真實數據‘
’索引的類型:
mysql中使用關鍵字 key index 標識索引
主鍵索引 primary key 主鍵約束 惟一性 不能爲null
惟一索引 unique key 惟一約束 惟一性 能夠爲null
普通索引 key
全文索引 fulltext key 只支持文本類型(char varchar text),文本中的內容進行分詞,分別創建索引 mysql5.6如下是innodb不支持
建立索引的方式:
①創建表結構設計索引
create table 表名(
字段~~~~~
primary key (id),
unique index 名字,
index 名字(字段),
index 名字(字段,字段), –複合索引
fulltext index 名字(字段);
)
②使用修改結構語法的語句(alter table)
alter table 表名
add primary key (id),
add unique key名字(字段),
add key|index 名字(字段),
add key 名字(字段,字段), –複合索引
add fulltext key 名字(字段);
若是不指定索引名稱,會默認選擇字段名稱,是複合索引的話,選擇第一個字段做爲索引名稱。若是索引名稱有重複衝突,會自動順延編號。服務器
alter table 表名稱 drop 索引類型 key 索引名稱
刪除主鍵索引
先更改主鍵的索引,而後再刪除
alter table student modify id int unsigned not null comment ‘id屬性’;
alter table student drop primay key;
刪除非主鍵索引使用key關鍵字,後面跟索引名稱
alter table student drop key introduce;
六、執行計劃explain
創建索引是爲了可以提升查詢效率。檢查索引是否使用到。
explain執行計劃,不會真實執行,分析sql語句執行的過程和使用的資源。
別名語法desc
語法:desc|explain 執行的sql語句 \G;
mysql> explain select * from emp where empno =10010\G;
索引使用場合
①where條件字段
explain select * from emp where empno=’10006’\G;
②order by 排序字段
desc select * from emp order by empno limit 5\G;
索引原則 創建的索引字段,可能沒有使用到索引。緣由是沒有遵照索引的使用原則。 ①列獨立 字段類型不可以進行運算操做。 若是列類型不獨立,就不可以使用到索引 ②左固定 模糊查詢 like 左固定 like 「1000%」; 給ename創建一個普通索引 ③複合索引 須要同時出如今條件中,纔可使用到複合索引,單獨使用不到 ④or條件 or條件字段若是都有索引可用,則索引均可用;若是有其中一個字段索引不可用,則都不可用。