国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據庫 > MySQL > 正文

MySQL性能優(yōu)化

2020-01-18 23:50:01
字體:
來源:轉載
供稿:網友

1. 簡介

在Web應用程序體系架構中,數(shù)據持久層(通常是一個關系數(shù)據庫)是關鍵的核心部分,它對系統(tǒng)的性能有非常重要的影響。MySQL是目前使用最多的開源數(shù)據庫,但是MySQL數(shù)據庫的默認設置性能非常的差,僅僅是一個玩具數(shù)據庫。因此在產品中使用MySQL數(shù)據庫必須進行必要的優(yōu)化。
優(yōu)化是一個復雜的任務,本文描述MySQL相關的數(shù)據庫設計和查詢優(yōu)化,服務器端優(yōu)化,存儲引擎優(yōu)化。

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

2.1 Schema Design
Schema的優(yōu)化取決于將要運行什么樣的query,不同的query會有不同的Schema優(yōu)化方案。2.2節(jié)將介紹Query Design的優(yōu)化。Schema設計同樣受到預期數(shù)據集大小的影響。Schema設計時主要考慮:標準化,數(shù)據類型,索引。

2.1.1 標準化

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

1) 所有的“對象”都在它自己的table中,沒有冗余。
2) 數(shù)據庫通常由E-R圖生成。
3) 簡潔,更新屬性通常只需要更新很少的記錄。
4) Join操作比較耗時。
5) Select,sort優(yōu)化措施比較少。
6) 適用于OLTP應用。

非標準化的特點:

1) 在一張表中存儲很多數(shù)據,數(shù)據冗余。
2) 更新數(shù)據開銷很大,更新一個屬性可能會更新很多表,很多記錄。
3) 在刪除數(shù)據是有可能丟失數(shù)據。
4) Select,order有很多優(yōu)化的選擇。
5) 適用于DSS應用。


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

1) 對OLTP使用標準化,對DSS使用非標準化
2) 使用物化視圖。MySQL不直接支持該數(shù)據庫特性,但是可以用MyISAM表代替。
3) 冗余一些數(shù)據在表格中,例如將ref_id和name存在同一張表中。但是要注意更新問題。
4) 對于一些簡單的對象,直接使用value作為建。例如IP address等
5) Reference by PRIMARY/UNIQUE KEY。MySQL可以優(yōu)化這種操作,例如:

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 數(shù)據類型
最基本的優(yōu)化之一就是使表在磁盤上占據的空間盡可能小。這能帶來性能非常大的提升,因為數(shù)據小,磁盤讀入較快,并且在查詢過程中表內容被處理所占用的內存更少。同時,在更小的列上建索引,索引也會占用更少的資源。
可以使用下面的技術可以使表的性能更好并且使存儲空間最小:

1) 使用正確合適的類型,不要將數(shù)字存儲為字符串。
2) 盡可能地使用最有效(最小)的數(shù)據類型。MySQL有很多節(jié)省磁盤空間和內存的專業(yè)化類型。
3) 盡可能使用較小的整數(shù)類型使表更小。例如,MEDIUMINT經常比INT好一些,因為MEDIUMINT列使用的空間要少25%。
4) 如果可能,聲明列為NOT NULL。它使任何事情更快而且每列可以節(jié)省一位。注意如果在應用程序中確實需要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))在數(shù)據的前面幾個字符建立索引。
9) 越是短的鍵值越好,最好使用integer。
10) 在查詢中要使用到索引(使用explain查看),可以減少讀磁盤的次數(shù),加速讀取數(shù)據。
11) 相近的鍵值比隨機好。Auto_increment就比uuid好。
12) Optimize table可以壓縮和排序index,注意不要頻繁運行。
13) Analyze table可以更新數(shù)據。

2.2 Designing queries
查詢語句的優(yōu)化是一個Case by case的問題,不同的sql有不同的優(yōu)化方案,在這里我只列出一些通用的技巧。

1) 在有index的情況下,盡量保證查詢使用了正確的index。可以使用EXPLAIN select …查看結果,分析查詢。
2) 查詢時使用匹配的類型。例如select * from a where id=5, 如果這里id是字符類型,同時有index,這條查詢則使用不到index,會做全表掃描,速度會很慢。正確的應該是 … where id=”5” ,加上引號表明類型是字符。
3) 使用--log-slow-queries

主站蜘蛛池模板: 定西市| 广饶县| 堆龙德庆县| 宝丰县| 海原县| 巴东县| 葫芦岛市| 彭山县| 裕民县| 读书| 墨竹工卡县| 苏尼特右旗| 灵寿县| 亳州市| 正蓝旗| 大宁县| 四川省| 客服| 峨山| 门头沟区| 禄丰县| 潼关县| 临泉县| 湖北省| 襄城县| 凉城县| 九龙坡区| 永川市| 黄龙县| 工布江达县| 贞丰县| 宁德市| 吴堡县| 抚顺市| 息烽县| 特克斯县| 田阳县| 太白县| 洪江市| 迁安市| 淮安市|