mysql資料庫最佳化與mysql在web效能最佳化

來源:互聯網
上載者:User
資料庫語句:
    Ddl(資料定義語言 (Data Definition Language))    alter  create   drop
   
    Dml(資料操作語言)   inset  delete  update
 
    Dtl(資料事務語言)  conmmit  rollback   savepoint
 
    Select
 
    Dcl(資料控制語句) grant賦許可權  revoke回收
  
   
Mysql資料庫最佳化:
1、  資料庫表 要設計合理(符合3NF,有時候也需要適當的逆範式)
2、  Sql語句的最佳化(索引,常用小技巧)
3、  資料庫的配置
4、  適當的硬體設定和作業系統
5、  讀寫分離
   
 
問:什麼是資料庫3範式?
    1NF: 就是具有原子性,不可分割(只要使用的是關係型資料庫,就會自動符合)
   2NF: 在滿足1NF的基礎上,我們考慮是否滿足2NF,只要表的記錄滿足唯一性,也就是說,你的同一張表中不可能出現完全相同的記錄,一般說我們在表中設計一個主鍵即可。
   3NF: 在滿足2NF: 的基礎上,我們考慮是否滿足3NF,既我們的欄位資訊可以通過關聯的關係,派生即可(通常我們通過外鍵來處理)使用外鍵資料庫的儲存引擎必須是innoDB
 
 
問2:資料庫參數配置
      對於innodb儲存引擎最重要的就是記憶體,所以下面的兩個參數調的很大
          Innodb_additional_mem_pool_size = 64M  
          Innodb_buffer_pool_size = 1G     緩衝池大小
     對於myisam,需要調整key_buffer_size
           用show  status 語句可以看到目前狀態,以決定調整那些參數
            
 
一、顯示你使用過多少次insert  , update   ,  delete 等
Sql:    show status  like  “Com”;
              //在命令視窗中不關閉的時候查詢會準確,如果關閉就會從新開始統計
              Show sessionstatus like “Com_update”;
              //就算關閉視窗也會將全部的你執行過的次數統計出來
              Show globalstatus like “Com_insert”;
 
Example:  session   
                     假如已經使用了6次update
1、  用session統計 會是6次
如果關閉後命令視窗後在執行Show session statuslike “Com_update”;  就為0了
2、  但是如果用Show global status like “Com_insert”;就是6次
 
二、顯示試圖串連Mysql伺服器的次數
              Show  status like  “Connections”;
 
    資料庫啟動多長時間了
              Show  status like   “uptime”;
      
       顯示慢查詢多少次(預設是10秒)
              Show  status like  “Slow_queries”;
 
四、如何在一個項目中,找到慢查詢的select,mysql資料庫支援把慢查詢的語句記錄到日誌中,供程式員來分析
       步驟:
1、 啟動mysql(特殊的啟動方式)
a)        在mysql的安裝目錄下的bin目錄下啟動mysqld.exe –slow-query
b)       Netstat –an 查看3306連接埠是否啟動
c)        查詢慢查詢的次數   show status  like  “Slow_queries”;
d)       設定慢查詢的時間   set long_query_time=1;
 
   索引最佳化:
 
比如說增加主鍵索引
              Alter  table user   add  primary key(id); 
刪除主鍵索引
              Alter  table user  drop  primary key
刪除索引
       Alter  table  user drop  index   索引名
顯示索引
        Show  index(es)  from  表名
         Show  keys  from  表名
         Desc  表名
   增加索引致使查詢會變快好多,其原理就像一本書如果沒有目錄的話那麼如果你想找一個知識點會很難找到,只能一點一點的翻著找,如果有目錄的話會很快的定位到這個知識點在那個章節中大概什麼位置這樣查詢起來自然就會快了啊,但是有利必有弊,索引會對查詢帶來好處,但是對add   update   delete  來說自然就很麻煩了,比如說你添加一個知識點,你不許還有在目錄中添加他是屬於那章那節中的那個知識點,同樣在修改和刪除的時候也會隨之改變,來保持資訊的準確性。
       
                                                                                                                 
一個自動分析是否需要使用索引的命令:explain
Example:  explain  select  *  from emp   where   id  =   9;
 
索引的分類:
         主鍵索引(primary   key)
         唯一鍵索引(unique)
         Index(普通索引)
         全文索引(fulltext)
         複合索引(多列和在一起)
 
在那些列上添加索引比較合適:
1、比較頻繁的作為查詢條件的欄位應該加上索引
2、  唯一性比較差的欄位不適合單獨建立索引,及時頻繁作為查詢條件
3、  更新非常頻繁的欄位不適合建立索引
4、  不會出現在where子句中的欄位不該建立索引
 
查詢一個表中的所有索引: show  indexes   from  table(表名)               
 
        索引的使用:
             查詢要使用索引最重要的條件是查詢條件中需要使用索引
             以下幾種情況可能會使用到索引
1、  對於建立的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用
2、  對於使用like的查詢,查詢如果是‘%aaa’不會使用到索引‘aaa%’會使用到索引
             以下的表中將不使用索引
1、  如果條件中有or,即使其中有條件帶索引也不會使用
2、  對於多列索引,不是使用的第一部分,則不會使用索引
3、  Like查詢是以%開頭
4、  如果列類型是字串,那麼一定要在條件中將資料使用引號引起來,否則不使用索引。
5、  如果mysql估計使用全表掃描要比使用索引快,則不使用索引。
 
 
查看索引的使用方式
     Show status  like   ‘handler_read%’;
 
只有handler_read_key  越大越好
     Handler_read_rnd_next  越小越好
 
 資料庫類型:
             MyISAM  不支援事務和外鍵,一張表由三個檔案組成,.frm  .myi  .myd
             innoDB    支援事務和外鍵   
            
             對於MyISAM來說查詢快,不過刪除欄位時空間是不會釋放的,必須使用手動釋放        optimize   table  table_name
 
 
 
資料庫分表:
1、  水平分表
 
 
2、  垂直分表:  
Stu表:
     id
     Name
     Pass
     Photo
Mark表
     Id
     Sid
     Question
     answer
垂直分錶針對於關聯類別型的表,比如說,有一個學生的個人資訊(有頭像)表,一個考試資訊(考試題和答案)表,這時我想查一個學生的考試分數和個人資訊,那麼mysql會將學生的個人資訊和考試資訊表關聯,速度回降低很多,所以要將考試資訊中的答案和題目分開在建立一個表,如果在提高還可以將頭像分開為一個單獨的表(如百度單獨的圖片伺服器)
 
 
讀寫分離:
 

 

Web程式慢,首先的一個檢測對象就是資料庫,寫過幾年程式的都知道。現在想追蹤MySQL中那些拖累伺服器效能的SQL語句,怎麼辦?需要開啟一個慢查詢輸出的一個機關:log_slow_queries。可以在MySQL設定檔中(my.ini/my.cnf)中設定,也可以通過MySQL用戶端臨時設定。第二種方法的好處是,可以不用重啟MySQL服務,而使設定生效。那就來試試這個:
首先通過用戶端串連到Mysql伺服器,然後輸入下面的語句:
SET GLOBAL log_slow_queries = ON;
SET GLOBAL long_query_time = 3;

這樣MySQL就會把耗時>=3秒的SQL語句給記錄下來,並輸出到一個慢查詢記錄檔中。問題來了,這個慢查詢記錄檔在什麼地方呢?如下,在MYSQL用戶端中執行下面的語句:
show variables like 'slow_query_log_file';
就會看到MySQL慢查詢記錄檔位置。我的是:/usr/local/mysql/data/host-slow.log

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.