mysql優化學習筆記

 mysql的優化總結有以下4點

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章