簡述: 如何對mysql數據數據庫進行有話進而提高程序代碼的執行速度,執行效率一直是一個比較重要的問題。
一、優化概述.
存儲層:存儲引擎、字段類型選擇、範式設計
設計層: 索引、緩存、分區分表
架構層:多個mysql服務器配置,讀寫分離(主從模式)
sql語句層:多個sql語句都可以達到目的的情況下,選擇性能搞的,速度快的sql語句
二、存儲引擎:
概念:存儲數據的技術和功能的合併就稱爲"存儲引擎"
查看mysql中所有的存儲引擎: > show engines;
InnoDB:
數據庫的每個數據表的數據設計三方面信息:表結構,數據,索引
技術特點:支持事務、行級鎖定、外鍵
數據存儲順序:按照主鍵的順序排列每個寫入的數據,該特點決定了該類型表的寫入操作比較慢
併發性高:該存儲引擎的鎖表級別是行鎖,只鎖定被操作的當前紀錄
事務: 把許多(增、刪、改)的sql語句捆綁在一起,要麼全部執行,包麼全部不執行
特點:原子性
一致性
持久性
隔離性
語法:commit 和 rollback 只能執行一個
start transaction;
許多sql語句
sql語句有問題
rollback; // 回滾
commit; // 提交
MyISAM:
該類型的存儲引擎的數據表 表結構(.frm)、表數據(.MYD)、表索引(.MYI)都有各自的存儲文件
特點: 獨立的文件存儲可以單獨備份和還原
存儲順序:按照自然順序排列每個寫進的數據,該特點決定了該表類型的寫入速度比較快
併發性:該類型的併發性較低 - 表鎖定
壓縮機制: 如果一個數據表的數據非常多,爲了節省存儲空間,需要對該表進行要鎖處理
複製當前表的數據: insert into order1 select null, order_num from order2;
問題:
壓縮的數據表是隻讀表,不能寫信息
壓縮數據表的特點:
不能頻繁的寫入操作,只是內容固定的數據表可以做壓縮處理,例如: 存儲全國地區信息的數據表
如果必須寫入數據,就得先解壓該數據表,寫入數據,再壓縮
InnoDB存儲引擎:適合做修改,刪除
MyISAM存儲引擎:適合做查詢,寫入操作
Archive:
歸檔存儲引擎,該引擎只有寫入,查詢操作,沒有修改,刪除操作
適用:存儲『日誌』性質的信息
Memory:
內存型存儲引擎,比較適合存儲臨時信息,服務器斷電,給存儲引擎的數據立即丟失
三、字段類型的選擇
字節佔用: tinyint(1)、 smallint(2)、 mediumint(3)、 int(4)、 bigint(8)
① 儘量少的佔用內存空間
年齡: tinyint 等
時間類型:
time():時分秒
datetime(): 年月日 時分秒
year(): 年份
date(): 年月日
timestamp(): 時間戳 1970-1-1 到現在的秒數
② 數據的整合最好固定長度
char(長度)
固定長度:運行速度快,255字符限制
長度不固定:內容表少要進行補位操作,該類型要保留1-2個字節保存當前的數據的長度 ,65535字節限制
③ 信息最好存儲爲整型
時間信息可以存儲爲整型(時間戳)
推薦使用set和enum類型,內部會通過整型信息參數進行具體計算,運行
ip地址也可以變爲整型信息進行存儲
mysql 內部 轉換ip:
ip轉整型:inet_aton(ip)
整型轉ip:inet_ntoa(數字)
php: ip2long(ip) long2ip(數字)
四、索引index
索引可以明顯提升查詢sql語句的速度
索引: 索引本身是一個獨立的存儲單位,在該單位記錄着數據表某個字段和字段對應的物理空間信息
① 索引類型
1. 主鍵索引: primary key
auto_increment 必須給主鍵索引設置
信息內容要求不能null,唯一
2.唯一索引:unique key
信息內容不能出現重複
3.普通索引:key
沒有具體要求
4. 全文索引:fulltext index
5. 複合索引
② 執行計劃 explain
針對查詢語句設置執行計劃,當前數據庫只有查詢語句支持執行計劃, 查詢sql語句真實執行之前所有的資源計劃就是執行計劃
具體操作:
explain 查詢sql語句\G;
ex: explain select * from emp where empno=123\G
③ 索引適合場景
1. where查詢條件:where 之後設置的查詢條件字段都適合做做索引
2. 排序查詢:排序字段適合做索引
3. 索引覆蓋,查詢的字段已經在索引裏邊存在,就直接獲取即可,不用在到數據庫中獲取了,該查詢速度非常快,效率高,該索引也成爲黃金索引
4. 給數據表的外鍵設置索引,可以提高連表查詢速度。
注: 索引本身要佔用一定的系統資源
五、索引原則
① 字獨立原則
select * from emp where empno=12343; // empno 條件字段獨立
select * from emp where empno+=123123; // empno 條件字段不獨立
② 左原則:查詢條件信息左邊出現,就給使用索引
③ 複合索引:
ename複合索引內部有兩個字段(ename, job)
① ename(前者字段)作爲查詢條件可以使用複合索引
② job(後者字段)作爲查詢條件不能使用複合索引
④ OR原則: OR左右的條件必須都具備了索引纔可以使用索引