性能優(yōu)化是通過合理安排資源,調(diào)整系統(tǒng)參數(shù)使MySQL運(yùn)行更快、更節(jié)省資源。主要包括查詢速度優(yōu)化、更新速度優(yōu)化、MySQL服務(wù)器優(yōu)化等。
概覽
MySQL數(shù)據(jù)庫優(yōu)化是多方面的,原則上是減少系統(tǒng)的瓶頸和資源的占用、增加系統(tǒng)的反應(yīng)速度。
MySQL常用的性能參數(shù)值如下表:
參數(shù)名 | 功能 |
---|---|
connections | 連接服務(wù)器的次數(shù) |
uptime | 服務(wù)器的上線時(shí)間 |
slow_queries | 慢查詢的次數(shù) |
com_select | 查詢操作的次數(shù) |
com_insert | 插入操作的次數(shù) |
com_update | 更新操作的次數(shù) |
com_delete | 刪除操作的次數(shù) |
查詢命令語法:
mysql> show status like 'NAME';
查詢速度優(yōu)化
在數(shù)據(jù)庫中,一般對(duì)數(shù)據(jù)的查詢操作是最頻繁的,提高數(shù)據(jù)的查詢速度可以有效提升數(shù)據(jù)庫的性能。
1. 分析查詢語句
通過分析查詢語句,可以了解查詢語句的執(zhí)行情況,找出查詢語句的不足之處,從而優(yōu)化查詢語句。
分析查詢語句有兩種方式:EXPLAIN和DESCRIBE。
1.1 EXPLAIN
基本語法:
EXPLAIN [EXTENDED] SELECT select_options
參數(shù)select_type:SELECT類型,可以為以下任何一種:
值 | 含義 |
---|---|
SIMPLE | 簡單SELECT(不使用UNION或子查詢) |
PRIMARY | 最外面的SELECT |
UNION | UNION中的第二個(gè)或后面的SELECT語句 |
DEPENDENT UNION | UNION中的第二個(gè)或后面的SELECT語句,取決于外面的查詢 |
UNION RESULT | UNION的結(jié)果。 |
SUBQUERY | 子查詢中的第一個(gè)SELECT |
DEPENDENT SUBQUERY | 子查詢中的第一個(gè)SELECT,取決于外面的查詢 |
DERIVED | 導(dǎo)出表的SELECT(FROM子句的子查詢) |
1.2 DESCRIBE
基本語法:
DESCRIBE SELECT select_options
2. 使用索引優(yōu)化查詢
索引可以快速定位表中的某條記錄,使用索引可以提高數(shù)據(jù)庫的查詢速度,從而提高數(shù)據(jù)庫的性能。如果不使用索引,查詢語句將掃描表中全部記錄,速度會(huì)很慢;使用索引,查詢語句可以根據(jù)索引快速定位到待查詢記錄,從而減少查詢的記錄數(shù),達(dá)到提高查詢速度的目的。
一般情況下,索引可以提高查詢速度,但并不是所有使用帶有索引的字段查詢都會(huì)起作用。例如下面幾種特殊情況:
- 使用LIKE關(guān)鍵字的查詢語句
- 使用多列索引的查詢語句
- 使用OR關(guān)鍵字的查詢語句
3. 優(yōu)化子查詢
子查詢可以進(jìn)行SELECT語句的嵌套查詢,即一個(gè)SELECT查詢的結(jié)果作為另一個(gè)的條件。它可以一次性完成很多邏輯上需要多個(gè)步驟才能完成的SQL操作。
其優(yōu)點(diǎn)是查詢語句很靈活,但是其執(zhí)行效率不高。
執(zhí)行子查詢時(shí),MySQL需要為內(nèi)層查詢語句的查詢結(jié)果建立一個(gè)臨時(shí)表,然后外層查詢語句從臨時(shí)表中查詢記錄。查詢完畢后,再撤銷這些臨時(shí)表。因此,子查詢的速度會(huì)受到一定的影響。如果查詢的數(shù)據(jù)量比較大,這種影響也隨之增大。
在MySQL中,可以使用連接(JOIN)查詢來替代子查詢。它不需要建立臨時(shí)表,速度比子查詢要快。如果查詢中使用索引的話,性能會(huì)更好。
數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化
合理的數(shù)據(jù)庫結(jié)構(gòu)不僅可以使數(shù)據(jù)庫占用更小的磁盤空間,而且能夠使查詢速度更快。設(shè)計(jì)時(shí),需要考慮數(shù)據(jù)冗余、查詢和更新的速度、字段的數(shù)據(jù)類型是否合理等多方面內(nèi)容。
1. 分解表
對(duì)于字段較多的表,如果有些字段的使用頻率很低,可以將這些字段分離出來形成新的表。因?yàn)楫?dāng)一個(gè)表的數(shù)據(jù)量很大時(shí),會(huì)由于使用頻率低的字段而變慢。
2. 建立中間表
對(duì)于需要經(jīng)常聯(lián)合查詢的表,可以建立中間表提高查詢效率。
3. 增加冗余字段
設(shè)計(jì)數(shù)據(jù)庫表時(shí)應(yīng)該盡量遵循數(shù)據(jù)庫范式理論的規(guī)約,盡可能減少冗余字段,讓數(shù)據(jù)庫看起來更加精致。但是,合理地加入冗余字段可以提高查詢速度。
表的規(guī)范化程度越高,表與表之間的關(guān)系就越多,需要連接查詢的情況也就越多。
不過冗余字段會(huì)導(dǎo)致一些新問題。如,一個(gè)表中的冗余字段值修改了,就要同步更新其他表中的該字段值,否則就會(huì)使原本一致的數(shù)據(jù)變得不一致。
4. 優(yōu)化插入速度
插入記錄時(shí),影響插入速度的主要是索引、唯一性校驗(yàn)、一次插入記錄條數(shù)等。
4.1. MyISAM引擎表
- 禁用索引
對(duì)于非空表,插入記錄時(shí),MySQL會(huì)根據(jù)表的索引對(duì)插入的記錄建立索引。如果插入大量數(shù)據(jù),建立索引會(huì)降低插入記錄的速度。可以在插入記錄前禁用索引,數(shù)據(jù)插入完畢后再開啟索引。
# 禁用索引
ALTER TABLE table_name DISABLE KEYS;
# 啟用索引
ALTER TABLE table_name ENABLE KEYS;
空表批量導(dǎo)入數(shù)據(jù)時(shí)不需要進(jìn)行此操作,因?yàn)镸yISAM引擎的表是在導(dǎo)入數(shù)據(jù)之后才建立索引的。
- 禁用唯一性檢查
插入數(shù)據(jù)時(shí),MySQL會(huì)對(duì)插入的記錄進(jìn)行唯一性校驗(yàn)。這種校驗(yàn)也會(huì)降低插入速度。可以先禁用,插入數(shù)據(jù)后再開啟。
# 禁用唯一性校驗(yàn)
SET UNIQUE_CHECKS=0;
# 啟用唯一性校驗(yàn)
SET UNIQUE_CHECKS=1;
-
使用批量插入
-
使用LOAD DATA INFILE批量導(dǎo)入
4.2. InnoDB引擎表
- 禁用唯一性檢查
和MyISAM引擎的使用一樣。 - 禁用外鍵檢查
# 禁用外鍵檢查
SET foreign_key_checks=0;
# 啟用外鍵檢查
SET foreign_key_checks=1;
- 禁止自動(dòng)提交
# 禁用自動(dòng)提交
SET autocommit=0;
# 啟用自動(dòng)提交
SET autocommit=1;
5. 分析表、檢查表和優(yōu)化表
MySQL提供了分析表、檢查表和優(yōu)化表的語句。
5.1. 分析表
分析表主要是分析關(guān)鍵字的分布,語法:
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE table_name1 [, table_name2, ...]
5.2. 檢查表
MySQL數(shù)據(jù)庫中可以使用CHECK TABLE檢查表,主要是檢查InnoDB和MyISAM類型的表是否存在錯(cuò)誤,語法:
CHECK TABLE table_name1 [, table_name2, ...] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
5.3. 優(yōu)化表
優(yōu)化表主要是消除刪除或者更新造成的空間浪費(fèi)。該語句對(duì)InnoDB和MyISAM類型的表都有效。主要是優(yōu)化表中的VARCHAR、BLOB或TEXT類型的字段。語法:
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE table_name1 [, table_name2, ...]
MySQL服務(wù)器的優(yōu)化
1. 服務(wù)器硬件優(yōu)化
服務(wù)器的硬件性能直接決定著MySQL數(shù)據(jù)庫的性能。優(yōu)化方向:文章來源:http://www.zghlxwxcb.cn/news/detail-843667.html
- 配置較大的內(nèi)存
- 配置調(diào)整磁盤系統(tǒng)
- 合理分布磁盤I/O
- 配置多處理器
2. MySQL參數(shù)優(yōu)化
通過優(yōu)化MySQL參數(shù)也可以在不提升硬件的前提下提高資源利用率,從而達(dá)到提高服務(wù)器性能的目的。配置參數(shù)都在my.cnf或者my.ini文件中。文章來源地址http://www.zghlxwxcb.cn/news/detail-843667.html
到了這里,關(guān)于mysql筆記:11. 性能優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!