網(wǎng)站優(yōu)化之 mysql 優(yōu)化二

從三方面著手

web 服務器

后臺程序

數(shù)據(jù)庫

索引的使用原則

如果mysql認為,全表掃描不會慢于使用索引,則mysql會放棄索引,直接使用全表查詢。

1.執(zhí)行計劃explain

捕捉性能常用的就是 打開‘慢查詢’,定位執(zhí)行效率差的sql,定位到sql執(zhí)行還不算完,還需要知道sql的執(zhí)行計劃,比如全表掃描還是索引掃描,這些都需要通過explain完成。

2.列獨立

索引字段不能夠進行運算操作。

如果索引字段在where條件中不獨立,就不能夠使用索引。

字符類型的字段,查詢時一定要添加引號(單引號),否則索引失效。

3.索引覆蓋

如果查詢的列正好是索引的一部分,那么查詢只需要在索引區(qū)上進行,不需要到數(shù)據(jù)區(qū)再找數(shù)據(jù),這種查詢速度非???,稱為“索引覆蓋”。 type=index 或 Extar using index (如果在innodb引擎下面,非主鍵索引取ID字段(主鍵)則會使用到索引覆蓋。

innodb

根據(jù)id查詢條件來得到id字段信息

因為是innodb,在普通索引上儲存了主鍵索引ID號,所以在用普通索引作為條件查詢主鍵時會使用到索引覆蓋。

myisam

使用主鍵索引來查詢會用到索引覆蓋

普通索引查詢id字段將不會用到索引覆蓋

4.like 查詢

一般情況下,再使用like查詢時,左邊字符中沒有%的情況下,才可以使用索引(向左原則)。

like的%向左原則有一個例外,索引覆蓋

注意:索引覆蓋會讓向左原則失效(在實際工作中模糊查詢盡量不要在左邊寫 %)

5.OR運算

如果出現(xiàn)OR運算,要求所有參與的運算的字段都在索引,才會使用到索引OR兩邊,最好都有獨立索引,實驗前提數(shù)據(jù)要夠大。

6.復合索引的使用

最左原則:

對于創(chuàng)建多列(復合)索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。

如果多字段查詢條件查詢,推薦使用組合索引,獨立索引只能讓一個索引生效。

查詢優(yōu)化sql語句

1.慢查詢?nèi)罩?/p>

慢查詢?nèi)罩臼莔ysql提供記錄所執(zhí)行的時間超過某個時間界限(默認10秒)的sql語句。在mysql中默認沒有開啟慢查詢。

show variables like 'slow%';(查看是否開啟了慢查詢

show variables like 'long_query_time';(查看默認觸發(fā)記錄的時間 單位:秒

set global slow_query_log = 1;? (開啟

set long_query_time = 3;(修改觸發(fā)事件

2。精確記錄查詢時間

使用mysql提供profile機制完成。profile記錄執(zhí)行每次sql語句完成的具體時間,精確時間到小數(shù)點的八位。

show variables like '%profiling%';(查看是否開啟

set profiling = 1;(開啟profile記錄

set profiling_history_size=20;(修改開啟記錄的記錄數(shù)

set profiling=0;(關(guān)閉

show profiles;(查看記錄sql語句的執(zhí)行時間

鎖與事務

1.鎖的操作

1.1幾種形式

鎖機制:當客戶端操作表(記錄)時候,為了保證操作的隔離型(多個客戶端操作不能互相影響),通過加鎖處理

操作處理:

讀鎖:讀操作時增加的鎖,叫做共享鎖,S-lock。特征是所有人都可以讀,只有釋放了鎖之后才可以寫。

共享鎖的缺點:數(shù)據(jù)完整性不能得到很好的保證。

寫鎖:寫操作時增加的鎖,也叫獨占鎖或拍他鎖,X-lock。特征:只有鎖表的客戶才可以操作表(讀寫),其他客戶讀也不可以

鎖定粒度(范圍)

表級鎖:開銷小,加鎖快,發(fā)生鎖沖突的概率最高,并發(fā)度最低

myisam 和 innodb的表 都支持表鎖

行級鎖;開銷大,加鎖慢,發(fā)生鎖沖突概率最低,并發(fā)度也很高。

innodb 的表支持行鎖和表鎖;

鎖是依賴于索引

1.2語法

lock tables 表名? read[讀鎖也叫共享鎖]|write[寫鎖或獨立鎖];(鎖定

unlock tables(釋放

mysql自動提交給關(guān)閉? set autocommit=0;(行級鎖? innodb

執(zhí)行語句:

select * from 表名 where id=100 lock in share mode 共享鎖

select * from 表名 where id=100 for update 排它鎖

2.事務操作

1.為什么要用事物

事物是一條或多條數(shù)據(jù)庫操作的集合,在事物中的操作,要么都執(zhí)行修改,要么都不執(zhí)行。銀行轉(zhuǎn)帳,支付,等都需要

2.事物的性質(zhì)

在mysql只有使用了innodb存儲引擎的表才支持事物

嚴格上來說,事物必須同時滿足四個特性,即通常說的ACID屬性。

原子性(atomicity):一個事物(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間的某個環(huán)節(jié)。事物在執(zhí)行中發(fā)生錯誤,會被回滾(Rollback)到事物開始前的狀態(tài),就像這個事物從來都沒有執(zhí)行過一樣。

一致性(consistency):在事物開始前和事物結(jié)束以后,數(shù)據(jù)完整性沒有被破壞。

隔離型(isolation):數(shù)據(jù)庫允許多個并發(fā)事物同時對其數(shù)據(jù)庫進行讀寫和修改的能力,隔離型可以防止多個事物并發(fā)執(zhí)行時由于交叉執(zhí)行而導致的數(shù)據(jù)不一致。

持久性(durability):事物處理結(jié)束后,對數(shù)據(jù)的修改就是永久的,即使系統(tǒng)故障也不會丟失。

start transaction(開始一個事務

sql語句

commit 事務確認? / rollback 事務回滾

查詢緩存

1.什么是查詢緩存

mysql服務器提供的,用于緩存select語句一種內(nèi)部內(nèi)存緩存系統(tǒng)。

如果開啟了查詢緩存,將所有的查詢結(jié)果,都緩存起來,使用同樣的select語句,再次查詢時,返回緩存的結(jié)果即可。

2.查詢緩存的設(shè)置情況

命令:show variables? like ‘query_cache%’;

# 配置說明

query_cache_limit:單個查詢能夠使用的緩沖區(qū)大小

query_cache_size:緩存空間大小,單位是字節(jié)

query_cache_type:是否有開啟緩存

配置查詢緩存

3.緩存失效

當數(shù)據(jù)表結(jié)構(gòu)發(fā)生改變時,緩存會失效

數(shù)據(jù)庫進行如下操作時:insert,update,delete 會使數(shù)據(jù)表數(shù)據(jù)發(fā)生變化,緩存失效

注:使用查詢緩存時,一定要注意 SQL語句的大小寫,大小不一致,生效的緩存就會是多條。

4.不實用緩存

sql查詢的語句是不固定的,有變化的,則不會使用到緩存,如隨機數(shù)【order by rand()】

5.查看緩存空間的使用情況

執(zhí)行:show status like ‘Qcache%’;

存儲過程

1.概念

存儲過程(procedure)

概念類似于函數(shù),就是把一段CURD的sql語句封裝起來,當要執(zhí)行這一段代碼的時候,可以調(diào)用該儲存過程來實現(xiàn)。

存儲過程是存儲數(shù)據(jù)庫中,經(jīng)過第一次編譯后再次調(diào)用不需要再次編譯。而SQL語句每執(zhí)行一次就編譯一次,所以使用

存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。

2.創(chuàng)建儲存過程

delimiter $$(改變結(jié)束分界符

create procedure 存儲過程名([類型in] 參數(shù)1 數(shù)據(jù)類型, [類型in] 參數(shù)2 數(shù)據(jù)類型,…)(創(chuàng)建

參數(shù)的類型:

in(輸入?yún)?shù)): 表示該形參只能接受實參的數(shù)據(jù)——這是默認值,不寫就是in;

out(輸出參數(shù)):表示該形參其實是用于將內(nèi)部的數(shù)據(jù)“傳出”到外部給實參;調(diào)用是用@變量調(diào)用

inout(輸入輸出參數(shù)):具有上述2個功能。

call 存儲過程名(參數(shù));(調(diào)用

drop procedure 存儲過程的名稱(刪除存儲過程

注:存儲過程是屬于數(shù)據(jù)庫,在哪個數(shù)據(jù)庫里面定義的,就在哪個數(shù)據(jù)庫里面調(diào)用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容