mysql的優化總結有以下4點
mysql優化學習筆記
1-數據庫(表)設計合理
我們的表設計要符合3NF 3範式(規範的模式) , 有時我們需要適當的逆範式
2-sql語句的優化(索引,常用小技巧.)
3-數據的配置(緩存設大)
4-適當硬件配置和操作系統 (讀寫分離.)
1-數據的範式
1NF :就是具有原子性,不可分割.(只要使用的是關係性數據庫,就自動符合)
2NF: 在滿足1NF 的基礎上,我們考慮是否滿足2NF: 只要表的記錄滿足唯一性,也是說,你的同一張表,不可能出現完全相同的記錄, 一般說我們在 表中設計一個主鍵即可.
3NF: 在滿足2NF 的基礎上,我們考慮是否滿足3NF:即我們的字段信息可以通過關聯的關係,派生即可.(通常我們通過外鍵來處理)
逆範式:有時候3NF會出現更多的冗餘,我們就應該使用逆範式。
範式的選擇是更具實際情況來決定的。當一個列的內容過大,更新平凡時候,我們更傾向於逆範式。
2-mysql索引優化
um-面試題 :sql語句有幾類
ddl (數據定義語言) [create alter drop]
dml(數據操作語言)[insert delete upate ]
select
dtl(數據事務語句) [commit rollback savepoint]
dcl(數據控制語句) [grant revoke]
dois-控臺查看sql命令執行效率
show status命令
該命令可以顯示你的mysql數據庫的當前狀態.我們主要關心的是 “com”開頭的指令
show status like ‘Com%’ <=> show session status like ‘Com%’ //顯示當前控制檯的情況
show global status like ‘Com%’ ; //顯示數據庫從啓動到 查詢的次數
顯示連接數據庫次數
show status like 'Connections';
這裏我們優化的重點是在 慢查詢. (在默認情況下是10 ) mysql5.5.19
顯示查看慢查詢的情況
show variables like ‘long_query_time’
tres-對mysql索引優化
對sql語句優化有最方便的就是添加主鍵了。(主鍵類似系統替我們分類了,需要的時候直接到某個類別裏面找,速度快很多。)
主鍵好處就是增加速度,不過主鍵會增大myi文件的體積(犧牲空間來增加速度,這就是索引)
怎麼才能合理的索引:
1-經常查詢的列上添加索引(where xx=‘’)
2-唯一性太差的列不要加索引。(比如對性別查詢。就2種結果,分類太少)
3-列的內容變化很大,(應爲索引會去讀寫.myi文件。變化過於平緩,時間都浪費在讀寫文件上了)
4-創建多列的索引(複合索引),先把最左邊的進行索引,如果沒帶入最左邊的索引,系統不會添加索引。
5-對於like語句 like "%c" 是不會被索引的,而 like 'c%'是可以被索引的。
6-如果條件裏面有or ,那麼系統不會使用索引(不過我測試索引參數都是有索引,那麼系統會使用索引。)
7-如果列的類型是字符串類型的,沒有加引號(''),那麼系統不會使用索引。
8-如果表的數據很少。我們就不要使用索引了。
索引的種類:
1-主鍵索引(primary)把某列設置爲主鍵,他會自動變成主鍵索引。
2-唯一索引(unique),既該列具有唯一性,且是索引。當設置unique時候,系統不會自動添加索引
3-普通索引(index)
4-全文索引(FULLTEXT)
5-複合索引(不是具體的,是多列合在一起)
如何創建索引:
1-如果創建是非主鍵索引:create [unique|fulltext] index 索引名字 on 表名(列名)
2-如果創建是非主鍵索引: alter table 表名 add index 索引名字 (列名)
3-添加主鍵索引:alter table 表名 add primary key (列名)
如何刪除索引:
1-刪除非主鍵索引: drop index 索引名 on 表名
2-刪除非主鍵索引: alter table 表名 driop index (索引名字)
3-刪除主鍵索引 :alter table 表名 drop primary key
查詢某表的索引:show indexes from 表名;
查看錶的存儲引擎:show create table 表名
查看索引使用情況:
show status like "Handler_read%"
Handler_read_key 值越高越好
Handler_read_rnd_next 越低越好。
myisam儲存和innodb的區別:
1- myisam不支持外鍵。innodb支持外鍵
2- myisam不支持事物。innodb支持事物
3- myisam刪除數據的時候,不會釋放硬盤空間。(必須定時清理)清除指令:optimize table 表名
3-sql語句優化
1-優化order by 排序
order 排序在exlain中可以看出是使用using file這樣影響速度。
我們可以這麼做:select * from admin order by a,order by null
2-在某些情況下使用join來替換子查詢。子查詢會在內存裏面創建臨時表。
3-在精確要求高的應用中,使用定點數(decimal)類型來存儲。千萬別用float(會誤差)
4-分表技術
1-水平分表,把記錄分別儲存到不同的數據庫裏。應用於數據量很大的。
2-
4-explain使用
explain是用於測試sql語句的效率。根據返回值,可以得到sql語句是否使用主鍵,他搜索記錄的範圍。效率
mysql> explain select * from test2 where id =1 \G
*************************** 1. row ***************
id: 1 //sql語句使用的索引
select_type: SIMPLE //
table: test2 //查詢的表名
type: const //有3種情況,all全表查詢(最不好),system(這是const連接的一個特例),const(唯一個匹配,速度最好)
possible_keys: PRIMARY,id //可能用到的索引
key: PRIMARY //實際用到的索引
key_len: 4
ref: const
rows: 1 //表示從多少記錄裏面找出,應爲索引關係才顯示一,如果沒索引就是全部記錄
Extra: //查詢喜劇信息。no tables(不查表查詢) using filesore(如果排序,order by xx不是索引。速度很慢,全表查詢)
//using where (通過索引查詢,速度比較好)
1 row in set (0.00 sec)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.