程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL性能優化詳解

MySQL性能優化詳解

編輯:關於MYSQL數據庫
1. MySQL性能優化簡介

在Web應用程序體系架構中,數據持久層(通常是一個關系數據庫)是關鍵的核心部分,它對系統的性能有非常重要的影響。MySQL是目前使用最多的開源數據庫,但是MySQL數據庫的默認設置性能非常的差,僅僅是一個玩具數據庫。因此在產品中使用MySQL數據庫必須進行必要的優化。

優化是一個復雜的任務,本文描述MySQL相關的數據庫設計和查詢優化,服務器端優化,存儲引擎優化。

2. 數據庫設計和查詢優化

在MySQL性能優化中,首先要考慮的就是Database Schema設計,這一點是非常重要的。一個糟糕的Schema設計即使在性能調優的MySQL Server上運行,也會表現出很差的性能;和Schema相似,查詢語句的設計也會影響MySQL的性能,應該避免寫出低效的SQL查詢。這一節將詳細討論這兩方面的優化。

2.1 Schema Design

Schema的優化取決於將要運行什麼樣的query,不同的query會有不同的Schema優化方案。2.2節將介紹Query Design的優化。Schema設計同樣受到預期數據集大小的影響。Schema設計時主要考慮:標准化,數據類型,索引。

2.1.1 標准化

標准化是在數據庫中組織數據的過程。其中包括,根據設計規則創建表並在這些表間建立關系;通過取消冗余度與不一致相關性,該設計規則可以同時保護數據並提高數據的靈活性。通常數據庫標准化是讓數據庫設計符合某一級別的范式,通常滿足第三范式即可。也有第四范式(也稱為 Boyce Codd范式,BCNF))與第五范式存在,但是在實際設計中很少考慮。忽視這些規則可能使得數據庫的設計不太完美,但這不應影響功能。

標准化的特點:

1) 所有的“對象”都在它自己的table中,沒有冗余。

2) 數據庫通常由E-R圖生成。

3) 簡潔,更新屬性通常只需要更新很少的記錄。

4) Join操作比較耗時。

5) Select,sort優化措施比較少。

6) 適用於OLTP應用。

非標准化的特點:

1) 在一張表中存儲很多數據,數據冗余。

2) 更新數據開銷很大,更新一個屬性可能會更新很多表,很多記錄。

3) 在刪除數據是有可能丟失數據。

4) Select,order有很多優化的選擇。

5) 適用於DSS應用。

標准化和非標准化都有各自的優缺點,通常在一個數據庫設計中可以混合使用,一部分表格標准化,一部分表格保留一些冗余數據:

1) 對OLTP使用標准化,對DSS使用非標准化

2) 使用物化視圖。MySQL不直接支持該數據庫特性,但是可以用MyISAM表代替。

3) 冗余一些數據在表格中,例如將ref_id和name存在同一張表中。但是要注意更新問題。

4) 對於一些簡單的對象,直接使用value作為建。例如IP address等

5) Reference by PRIMARY/UNIQUE KEY。MySQL可以優化這種操作,例如:

Java 代碼
  • select city_name
  • from city,state
  • where state_id=state.id and state.code=‘CA’” converted to “select city_name from city where state_id=12  

    2.1.2 數據類型

    最基本的優化之一就是使表在磁盤上占據的空間盡可能小。這能帶來性能非常大的提升,因為數據小,磁盤讀入較快,並且在查詢過程中表內容被處理所占用的內存更少。同時,在更小的列上建索引,索引也會占用更少的資源。

    可以使用下面的技術可以使表的性能更好並且使存儲空間最小:

    1) 使用正確合適的類型,不要將數字存儲為字符串。

    2) 盡可能地使用最有效(最小)的數據類型。MySQL有很多節省磁盤空間和內存的專業化類型。

    3) 盡可能使用較小的整數類型使表更小。例如,MEDIUMINT經常比INT好一些,因為MEDIUMINT列使用的空間要少25%。

    4) 如果可能,聲明列為NOT NULL。它使任何事情更快而且每列可以節省一位。注意如果在應用程序中確實需要NULL,應該毫無疑問使用它,只是避免 默認地在所有列上有它。

    5) 對於MyISAM表,如果沒有任何變長列(VARCHAR、TEXT或BLOB列),使用固定尺寸的記錄格式。這比較快但是不幸地可能會浪費一些空間。即使你已經用CREATE選項讓VARCHAR列ROW_FORMAT=fixed,也可以提示想使用固定長度的行。

    6) 使用sample character set,例如latin1。盡量少使用utf-8,因為utf-8占用的空間是latin1的3倍。可以在不需要使用utf-8的字段上面使用 latin1,例如mail,url等。

    2.1.3 索引

    所有MySQL列類型可以被索引。對相關列使用索引是提高SELECT操作性能的最佳途徑。使用索引應該注意以下幾點:

    1) MySQL只會使用前綴,例如key(a, b) …where b=5 將使用不到索引。

    2) 要選擇性的使用索引。在變化很少的列上使用索引並不是很好,例如性別列。

    3) 在Unique列上定義Unique index。

    4) 避免建立使用不到的索引。

    5) 在Btree index中(InnoDB使用Btree),可以在需要排序的列上建立索引。

    6) 避免重復的索引。

    7) 避免在已有索引的前綴上建立索引。例如:如果存在index(a,b)則去掉index(a)。

    8) 控制單個索引的長度。使用key(name(8))在數據的前面幾個字符建立索引。

    9) 越是短的鍵值越好,最好使用integer。

    10) 在查詢中要使用到索引(使用explain查看),可以減少讀磁盤的次數,加速讀取數據。

    11) 相近的鍵值比隨機好。Auto_increment就比uuid好。

    12) Optimize table可以壓縮和排序index,注意不要頻繁運行。

    13) Analyze table可以更新數據。

    2.2 Designing querIEs

    查詢語句的優化是一個Case by case的問題,不同的sql有不同的優化方案,在這裡我只列出一些通用的技巧。

    1) 在有index的情況下,盡量保證查詢使用了正確的index。可以使用EXPLAIN select …查看結果,分析查詢。

    2) 查詢時使用匹配的類型。例如select * from a where id=5, 如果這裡id是字符類型,同時有index,這條查詢則使用不到index,會做全表掃描,速度會很慢。正確的應該是 … where id=”5” ,加上引號表明類型是字符。

    3) 使用--log-slow-querIEs –long-query-time=2查看查詢比較慢的語句。然後使用explain分析查詢,做出優化。

    3. 服務器端優化

    3.1 MySQL安裝

    MySQL有很多發行版本,最好使用MySQL AB發布的二進制版本。也可以下載源代碼進行編譯安裝,但是編譯器和類庫的一些bug可能會使編譯完成的MySQL存在潛在的問題。

    如果安裝 MySQL的服務器使用的是Intel公司的處理器,可以使用intel c++編譯的版本,在Linux World2005的一篇PPT中提到,使用intel C++編譯器編譯的MySQL查詢速度比正常版本快30%左右。Intel c++編譯版本可以在MySQL官方網站下載。

    3.2 服務器設置優化

    MySQL默認的設置性能很差,所以要做一些參數的調整。這一節介紹一些通用的參數調整,不涉及具體的存儲引擎(主要指MyISAM,InnoDB,相關優化在4中介紹)。

    --character-set:如果是單一語言使用簡單的character set例如latin1。盡量少用Utf-8,utf-8占用空間較多。

    --memlock:鎖定MySQL只能運行在內存中,避免 swapping,但是如果內存不夠時有可能出現錯誤。

    --max_allowed_packet:要足夠大,以適應比較大的SQL查詢,對性能沒有太大影響,主要是避免出現packet錯誤。

    --max_connections:server允許的最大連接。太大的話會出現out of memory。

    --table_cache:MySQL在同一時間保持打開的table的數量。打開table開銷比較大。一般設置為512。

    --query_cache_size: 用於緩存查詢的內存大小。

    --datadir:MySQL存放數據的根目錄,和安裝文件分開在不同的磁盤可以提高一點性能。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved