表的設計合理化(符合3NF)mysql
添加適當索引(index) [四種: 普通索引、主鍵索引、惟一索引unique、全文索引]sql
SQL語句優化數據庫
分表技術(水平分割、垂直分割)編程
讀寫[寫: update/delete/add]分離緩存
存儲過程 [模塊化編程,能夠提升速度]安全
對mysql配置優化 [配置最大併發數my.ini, 調整緩存大小 ]服務器
mysql服務器硬件升級session
定時的去清除不須要的數據,定時進行碎片整理(MyISAM)架構
爲了創建冗餘較小、結構合理的數據庫,設計數據庫時必須遵循必定的規則。在關係型數據庫中這種規則就稱爲範式。範式是符合某一種設計要求的總結。要想設計一個結構合理的關係型數據庫,必須知足必定的範式。併發
第一範式:1NF是對屬性的原子性約束,要求屬性(列)具備原子性,不可再分解;(只要是關係型數據庫都知足1NF)
第二範式:2NF是對記錄的唯一性約束,表中的記錄是惟一的, 就知足2NF, 一般咱們設計一個主鍵來實現,主鍵不能包含業務邏輯。
第三範式:3NF是對字段冗餘性的約束,它要求字段沒有冗餘。 沒有冗餘的數據庫設計能夠作到。
可是,沒有冗餘的數據庫未必是最好的數據庫,有時爲了提升運行效率,就必須下降範式標準,適當保留冗餘數據。具體作法是: 在概念數據模型設計時遵照第三範式,下降範式標準的工做放到物理數據模型設計時考慮。下降範式就是增長字段,容許冗餘。
垂直拆分就是要把表按模塊劃分到不一樣數據庫表中(固然原則仍是不破壞第三範式),這種拆分在大型網站的演變過程當中是很常見的。當一個網站還在很小的時候,只有小量的人來開發和維護,各模塊和表都在一塊兒,當網站不斷豐富和壯大的時候,也會變成多個子系統來支撐,這時就有按模塊和功能把表劃分出來的需求。其實,相對於垂直切分更進一步的是服務化改造,說得簡單就是要把原來強耦合的系統拆分紅多個弱耦合的服務,經過服務間的調用來知足業務需求看,所以表拆出來後要經過服務的形式暴露出去,而不是直接調用不一樣模塊的表,淘寶在架構不斷演變過程,最重要的一環就是服務化改造,把用戶、交易、店鋪、寶貝這些核心的概念抽取成獨立的服務,也很是有利於進行局部的優化和治理,保障核心模塊的穩定性
垂直拆分用於分佈式場景。
上面談到垂直切分只是把表按模塊劃分到不一樣數據庫,但沒有解決單表大數據量的問題,而水平切分就是要把一個表按照某種規則把數據劃分到不一樣表或數據庫裏。例如像計費系統,經過按時間來劃分表就比較合適,由於系統都是處理某一時間段的數據。而像SaaS應用,經過按用戶維度來劃分數據比較合適,由於用戶與用戶之間的隔離的,通常不存在處理多個用戶數據的狀況,簡單的按user_id範圍來水平切分
通俗理解:水平拆分行,行數據拆分到不一樣表中, 垂直拆分列,表數據拆分到不一樣表中
MySQL默認10秒內沒有響應SQL結果,則爲慢查詢
能夠去修改MySQL慢查詢默認時間
--查詢慢查詢時間 show variables like 'long_query_time'; --修改慢查詢時間 set long_query_time=1; ---可是重啓mysql以後,long_query_time依然是my.ini中的值
經常使用命令 --mysql數據庫啓動了多少時間 show status like 'uptime'; show stauts like 'com_select' show stauts like 'com_insert' ...類推 update delete(顯示數據庫的查詢,更新,添加,刪除的次數) show [session|global] status like .... 若是你不寫 [session|global] 默認是session 會話,指取出當前窗口的執行,若是你想看全部(從mysql 啓動到如今,則應該 global) //顯示到mysql數據庫的鏈接數 show status like 'connections '; //顯示慢查詢次數 show status like 'slow_queries';
在默認狀況下,咱們的mysql不會記錄慢查詢,須要在啓動mysql時候,指定記錄慢查詢才能夠
bin\mysqld.exe --safe-mode --slow-query-log [mysql5.5 能夠在my.ini指定](安全模式啓動,數據庫將操做寫入日誌,以備恢復)
bin\mysqld.exe –log-slow-queries=d:/abc.log [低版本mysql5.0能夠在my.ini指定]
先關閉mysql,再啓動, 若是啓用了慢查詢日誌,默認把這個文件放在
my.ini 文件中記錄的位置
#Path to the database root
datadir=" C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
詳細優化SQL過程:
首先經過日誌來找到慢查詢的語句,在經過執行計劃確認慢查詢的緣由,再更加狀況優化語句,避免使用致使全表掃描關鍵字
另外再優化時,咱們能夠更加需求添加索引,配置讀寫分離,數據量大的時候適當的分表
而後能夠配置Mysql的鏈接狀態,適當增長數據庫服務器的配置