最佳左字首原則為,保持索引的定義和使用順序的一致性
將含in的範圍查詢,放到where條件語句的最後。
索引需要逐步優化
小表驅動大表
復合索引,不要跨列或無序使用(最佳左字首)
復合索引,盡量使用全索引匹配。就是盡量避免復合索引有三列,而只用到兩列。
復合索引不能使用範圍查詢(!= <>)或is null (is not null),否則自身及右側索引全部失效。
不要對索引進行操作(計算,函式,型別轉換),否則索引失效。
select .. where a.x*3 = ...
-- a.x列存在索引,索引失效
注意:sql優化,是一種概率層次的優化,原因是服務層中有sql優化器,可能會影響我們的優化,出現與我們預期不符的情況。
盡量不要使用or,會使左右兩邊索引全部失效。
exist 和 in :如果主查詢的資料極大,則使用in,如果子查詢的資料大,則使用exist。
order by :選擇使用單路還是雙路;調整buffer容量的大小;避免使用select *…;復合索引不要跨列使用。
mysql提供的一種日誌記錄,用於記錄mysql中響應超過閾值的sql語句(預設是10秒),慢查詢日誌預設是關閉的,建議:開發時開啟,最終部署時關閉。
show variables like
'%slow_query_log%'
;
-- 檢視profiles是否開啟
show variables like
'%profiling%'
;
檢視sql語句執行的query_id以及持續時間
show profiles;
注意: show profiles可以看到profiling開啟之後的sql語句,會顯示id,持續時間,以及sql語句,但是我們無法精準的看到各個硬體消費的時間。
檢視sql語句執行的具體硬體消費情況
-- 檢視全部資訊
show profile all
for query query_id;
-- 檢視部分資訊
show profile cpu, block io for query query_id;
全域性檢視日誌會記錄開啟之後的全部sql語句,因此比較耗費效能。所以我們僅在調優、開發時使用。而且全域性查詢日誌資訊較少,所以使用較少。使用方法
-- 檢視是否開啟
show variables like
'%general_log%'
;-- 開啟全域性查詢日誌
setglobal general_log =1;
setglobal log_output=
'table'
;-- 表明我們將sql存在表裡。mysql.general_log表。
setglobal log_output=
'file'
;set
global general_log_file=
'目錄/general.log'
;-- 表明將sql儲存在檔案裡
setglobal general_log =1;
-- 如果無效就需要再開啟一下
myisam只支援表鎖,innodb支援表鎖和行鎖
-- 加鎖
lock
table 表1
read
/write
, 表1
read
/write..
.;-- 釋放鎖
unlock
tables
;-- 檢視表加鎖情況
show
open
tables
;
讀鎖(共享鎖)會話1 對 a 表加 讀 鎖
會話1其他會話
a表可以讀,不可以寫
可以讀取,想要更新必須等待會話1釋放表鎖
其他表不可以讀寫
可以讀寫
寫鎖(互斥鎖)
會話1 對 a 表加 寫 鎖
關閉自動提交
-- 以下三種方式都可以
set autocommit=0;
start
transaction
;begin
;
集群和分布式:用板磚來比喻,一開始乙個人負責搬磚和運磚,後來工頭嫌他慢,又找了幾個人幫他一起搬磚運磚,這叫集群(多個伺服器支援乙個專案)。後來工頭還不滿足,就讓一群人專門負責搬磚,另一群人專門負責運磚,這叫分布式(乙個專案劃分為幾個部分)。
主從複製大概過程:
最優化基礎(二)
在演算法的收斂性分析中,需要用到向量和矩陣範數的概念及其有關理論。範數 norm 是具有 長度 概念的函式。設r n 表示實n維向量空間,rn n 表示實n階矩陣全體所組成的線性空間.在這兩個空間中,我們分別定義向量和矩陣的範數.向量x rn的範數 x 是乙個非負數,它必須滿足以下條件 1.非負性 ...
MySQL優化(二) 優化SQL語句
2.優化子查詢,派生表和檢視引用 3.優化information schema查詢 4.優化資料變更宣告 5.優化資料庫許可權 6.其他優化技巧 資料庫應用程式的核心邏輯是通過sql語句執行的,無論是直接通過直譯器發出還是通過api在後台提交。查詢以select 語句的形式執行資料庫中的所有查詢操作...
mysql 效能優化(二)
今天突然看到一年前寫的 mysql 優化 一 感覺有些誤人子弟。今天再補充一些東西。關於引擎選擇,從理論上 和 實際上 可能會有差距,所以,對待mysql 要有實驗精神。一般來說,myisam 適合 1.做很多count 的計算。2.插入不平凡,查詢非常頻繁。3.沒有事務 innordb 非常適合 ...