歪枣网Mysql优化总结
SQL優(yōu)化
創(chuàng)建索引可以大大提高系統(tǒng)的性能。
第一,通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
第二,可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
第四,在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí),同樣可以顯著減少查詢中分組和排序的時(shí)間。
第五,通過使用索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
也許會(huì)有人要問:增加索引有如此多的優(yōu)點(diǎn),為什么不對(duì)表中的每一個(gè)列創(chuàng)建一個(gè)索引呢?因?yàn)?#xff0c;增加索引也有許多不利的方面。
第一,創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加。
第二,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個(gè)索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會(huì)更大。
第三,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候,索引也要?jiǎng)討B(tài)的維護(hù),這樣就降低了數(shù)據(jù)的維護(hù)速度
索引是建立在數(shù)據(jù)庫表中的某些列的上面。在創(chuàng)建索引的時(shí)候,應(yīng)該考慮在哪些列上可以創(chuàng)建索引,在哪些列上不能創(chuàng)建索引。一般來說,應(yīng)該在這些列上創(chuàng)建索引:在經(jīng)常需要搜索的列上,可以加快搜索的速度;在作為主鍵的列上,強(qiáng)制該列的唯一性和組織表中數(shù)據(jù)的排列結(jié)構(gòu);在經(jīng)常用在連接的列上,這些列主要是一些外鍵,可以加快連接的速度;在經(jīng)常需要根據(jù)范圍進(jìn)行搜索的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,其指定的范圍是連續(xù)的;在經(jīng)常需要排序的列上創(chuàng)建索引,因?yàn)樗饕呀?jīng)排序,這樣查詢可以利用索引的排序,加快排序查詢時(shí)間;在經(jīng)常使用在WHERE子句中的列上面創(chuàng)建索引,加快條件的判斷速度。
數(shù)據(jù)庫和表的字符集統(tǒng)一使用 UTF8
禁止在數(shù)據(jù)庫中存儲(chǔ)圖片,文件等大的二進(jìn)制數(shù)據(jù)
通常文件很大,會(huì)短時(shí)間內(nèi)造成數(shù)據(jù)量快速增長,數(shù)據(jù)庫進(jìn)行數(shù)據(jù)庫讀取時(shí),通常會(huì)進(jìn)行大量的隨機(jī) IO 操作,文件很大時(shí),IO 操作很耗時(shí)。
通常存儲(chǔ)于文件服務(wù)器,數(shù)據(jù)庫只存儲(chǔ)文件地址信息
數(shù)據(jù)庫字段設(shè)計(jì)規(guī)范
1、優(yōu)先選擇符合存儲(chǔ)需要的最小的數(shù)據(jù)類型,比如對(duì)于非負(fù)型的數(shù)據(jù) (如自增 ID,整型 IP) 來說,要優(yōu)先使用無符號(hào)整型來存儲(chǔ)
2、盡可能把所有列定義為 NOT NULL
索引 NULL 列需要額外的空間來保存,所以要占用更多的空間
進(jìn)行比較和計(jì)算時(shí)要對(duì) NULL 值做特別的處理
數(shù)據(jù)庫 SQL 開發(fā)規(guī)范
充分利用表上已經(jīng)存在的索引
避免使用雙%號(hào)的查詢條件。如:a like ‘%123%’,(如果無前置%,只有后置%,是可以用到列上的索引的)
在定義聯(lián)合索引時(shí),如果 a 列要用到范圍查找的話,就要把 a 列放到聯(lián)合索引的右側(cè),使用 left join 或 not exists 來優(yōu)化 not in 操作,因?yàn)?not in 也通常會(huì)使用索引失效禁止使用 SELECT * 必須使用 SELECT <字段列表> 查詢
在where子句中使用 IS NULL 或 IS NOT NULL 判斷,索引將被放棄使用,會(huì)進(jìn)行全表查詢。
WHERE 從句中禁止對(duì)列進(jìn)行函數(shù)轉(zhuǎn)換和計(jì)算
減少同數(shù)據(jù)庫的交互次數(shù)
避免使用子查詢,可以把子查詢優(yōu)化為 join 操作
通常子查詢在 in 子句中,且子查詢中為簡單 SQL(不包含 union、group by、order by、limit 從句) 時(shí),才可以把子查詢轉(zhuǎn)化為關(guān)聯(lián)查詢進(jìn)行優(yōu)化。
子查詢性能差的原因:
子查詢的結(jié)果集無法使用索引,通常子查詢的結(jié)果集會(huì)被存儲(chǔ)到臨時(shí)表中,不論是內(nèi)存臨時(shí)表還是磁盤臨時(shí)表都不會(huì)存在索引,所以查詢性能會(huì)受到一定的影響。特別是對(duì)于返回結(jié)果集比較大的子查詢,其對(duì)查詢性能的影響也就越大。
由于子查詢會(huì)產(chǎn)生大量的臨時(shí)表也沒有索引,所以會(huì)消耗過多的 CPU 和 IO 資源,產(chǎn)生大量的慢查詢。
拆分復(fù)雜的大 SQL 為多個(gè)小 SQL
大 SQL 邏輯上比較復(fù)雜,需要占用大量 CPU 進(jìn)行計(jì)算的 SQL
MySQL 中,一個(gè) SQL 只能使用一個(gè) CPU 進(jìn)行計(jì)算
SQL 拆分后可以通過并行執(zhí)行來提高處理效率
慢查詢
1、查詢當(dāng)前慢查詢?nèi)罩镜臓顟B(tài)
show variables like “%slow_query_log%”;
set global slow_query_log=on;
2、修改mysql配置文件保證永久生效
由于慢查詢?nèi)罩居涗浀男畔⒈容^多,會(huì)影響mysql的性能,所以生產(chǎn)環(huán)境不建議長期開啟
vim /etc/my.cnf
slow_query_log=1
slow_query_log_file=/usr/local/mysql/data/slow-query.log
3、# 其他可用的配置參數(shù)
long_query_time=1# 慢查詢?nèi)罩镜臅r(shí)間定義(秒),默認(rèn)為10秒,多久就算慢查詢的日志
log_queries_not_using_indexes=1 # 將所有沒有使用帶索引的查詢語句全部寫到慢查詢?nèi)罩局?br /> 有興趣的可以訪問歪棗網(wǎng),學(xué)習(xí)交流,網(wǎng)站:www.waizaowang.com
總結(jié)
以上是生活随笔為你收集整理的歪枣网Mysql优化总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET MVC5+EF6+Eas
- 下一篇: DBD::mysql::db do fa