對mysql優化時一個綜合性的技術,只要包括
a 表的設計合理化(3NF)
b 添加適當索引(index)[四種:普通索引 全文索引 主鍵索引 唯一索引(unique) 全文索引
c 分表技術(水平分割 垂直分割)
d 讀寫[寫:update/delete/add]分離
e 存儲過程[模塊化編程,可以提高速度]
f 對mysql配置優化[配置併發數my.ini,調整緩存大小]
g mysql 服務器硬件升級
h 定時的去清除不需要的數據,定時進行碎片整理(myisam)
什麼樣的表纔是符合3NF(範式)
表的範式,是首先符合1NF,才能滿足2NF,進一步滿足3NF
1NF:即表的列具有原子性,不可在分解,即列的信息不能分解,只要數據庫是關係型數據,就自動滿足1NF.
2NF:表中的記錄是唯一的,就滿足2NF,通常我們設計一個主鍵來實現.
3NF:即表中不要有冗餘數據,也就是說,表的信息如果能夠被推導出來,就不應該單獨的設計一個字段來存放.
SQL語句優化
sql語句本身的優化
問題是:如何從一個大項目,迅速的定位執行速度慢的語句(定位慢查詢)
1 首先我們瞭解mysql數據庫的一些運行狀態如何查詢(比如想知道當前mysql運行的時間/一共執行了多少次 select/update/delete.../)
show status;
常用的:
show status like 'uptime'
show status like 'com_select' show status like 'com_insert'/'com_delete'
show [session|global] status like ... 如果你不寫[session|global] 默認是session會話,指取出當前窗口的執行,如果想看所有(從mysql啓動到現在,則應該用global)
show status like 'connection'; //顯示慢查詢次數
show status like 'slow_queries';
2 如何去定位慢查詢
構建一個大表(400萬)`存儲過程的構建
默認情況下,mysql認爲10秒纔是一個慢查詢
修改mysql的慢查詢
show variables like 'long_query_time';
set long_query_time=1;