從三方面著手
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)用。