說明索引的設計和使用
sql中的安全問題
常用sql技巧
sql優化過程
優化資料庫物件
鎖問題
本站:
深入淺出mysql
個人部落格:
深入淺出mysql
1 設計索引原則
2 小常識
3 btree索引
1 了解sql執行頻率
使用show [session | global] statusa來獲得伺服器狀態資訊。
session表示當前連線,如果直接寫show status, 則預設是session。
global表示從資料庫上次啟動至今的統計結果。
show
global status like
'com_%';
在結果中可以看下
com_select: 執行select操作次數
com_insert: 執行insert操作次數,批量插入只累加1
com_update: 執行update操作次數
com_delete: 執行delete操作次數
通過以上資訊,就可以了解到是以更新為主還是查詢為主了。
2 explain分析
假設有一張account表存在id(主鍵), phone欄位,且未對phone建立索引。
通過id查詢:
explain select * from account where id = 10839792;
輸出:
id select_type table type possible_keys key key_len ref rows extra
1 ****** account const primary primary 4
const
1null
我們可以看到,rows=1, 表示掃瞄了1行接得到了結果。
通過phone查詢:
explain select * from account where phone = 1899713***x;
輸出:
id select_type table type possible_keys key key_len ref rows extra
1 ****** account all
null
null
null
null
48130 using where
可以看到,掃瞄了48130行才得到想要的結果。
如果這個查詢很常用,就有必要對phone建立索引,特別是account表很龐大的時候,速度優勢很明顯。
explain顯示了mysql如何使用索引來處理select語句以及連線表。可以幫助選擇更好的引擎和寫出更佳的查詢語句。
type, 表示在表中找到所需行的方式,也稱訪問型別。
possible_keys: 提示使用了哪些索引可以找到該行。
keys: 使用的索引。
key_len: 索引使用的長度。
ref: 哪些列或常量被用於查詢索引列上的值。
explain
select a.role_id, a.role_name, (select
sum(money) as total_recharge
from user_pay b where a.role_id = b.role_id) from
user a;
輸出:
id table type possible_keys key key_len ref rows
1 a all
null
null
null
null
402 b ref role_id role_id 8 test.a.role_id 3
子句中使用a.role_id來查詢匹配。
rows: 估算的找到所需的記錄所需要讀取的行數。
filtered: 顯示了通過條件過濾出的行數的百分比估計值。
extra: 比較重要的額外資訊。
3 檢視索引使用情況
show status like
'handler_read%';
輸出:
variable_name value
handler_read_first 38
handler_read_key 2044
handler_read_last 0
handler_read_next 988904
handler_read_prev 0
handler_read_rnd 2154
handler_read_rnd_next 1022038
4 定期分析表和檢查表
5 定期優化表
6 常用sql優化
優化group by語句
在包含了group by語句,會有乙個預設的排序,如果沒有必要對結果進行排序,可以用order by null取消排序。
select role_id, sum(money) as total_recharge from user_pay group
by role_id order
bynull;
優化order by語句
當以下情況時,order by也可以借助索引來排序
優化巢狀查詢
使用sql提示
1 優化表的資料型別
示例select * from user procedure analyse(16, 256);
,注意看optimal_fieldtype中給予的建議。如果表中資料量小,要注意區分建議的侷限性。
2 通過拆分表提高表的訪問效率
對於myisam型別的表:
* 垂直拆分: 把主鍵和一些列放在一張表,把主鍵和另一些列放在另一張表。特別在一張表中,有的列常用,而有些列不常用的時候,可以這麼拆。好處是使得資料行變小,查詢的時候會減少i/o次數。缺點是查詢所有資料的時候要join操作。
* 水平拆分: 把很大的表拆成好幾張,比如最近3個月的資料一張,3個月以前的表一張。
3 使用中間表提供統計查詢速度1 鎖
2 myisam表鎖
鎖排程
3 innodb鎖
todo
深入淺出Mysql(四)
大批量插入資料優化 1 對應myisam型別的表,可以通過以下方式快速的匯入大量資料 alter table tablname disable keys loading the data alter table tablname enable keys 這兩個命令用來開啟或者關閉myisam表非唯一...
深入淺出MySQL筆記(二)
本筆記為學習該書所記,便於複習。包含第三 四章筆記。資料型別與運算子 toc 整數型別 zerofill unsigned auto increment 浮點數型別 定點數型別 decimal m,d show warningsl 位型別bit m hex data datatime timesta...
深入淺出MySQL筆記(三)
本筆記為學習該書所記,便於複習。包含第五 六章筆記。常用函式與圖形化工具的使用。toc 常用字串函式 concat s1,s2.sn 連線s1,s2.sn為乙個字串 insert str,x,y,instr 將字串str從第x位置開始,y個字元長的子串替換為字串instr lower str 將字串...