mysql優化


Mysql優化
  字段設計

    遵循三范式。你想想你們公司如果連數據庫字段都沒有一個規則的話,也就是說你們公司開發都沒有一個限制,那么你們是不是開發起來對接起來很麻煩呀,包括后面來的人接手前面的工作,完成搞不懂前一個人的開發流程。這樣維護起來是不是很麻煩?

    原則:定長和非定長數據類型的選擇
    decimal不會損失精度,存儲空間會隨數據的增大而增大。double占用固定空間,較大數的存儲會損失精度。非定長的還有varchar、text
    原則:盡可能使用 not null
    
null字段的處理要比null字段的處理高效些!且不需要判斷是否為null因為nullMySQL中,不好處理,存儲需要額外空間,運算也需要特殊的運算符。

    語句優化:
    
語句1:select * from student limit 9,4
    語句2:slect * from student limit 4 offset 9
    // 語句1和2均返回表student的第10、11、12、13行 
    // 語句2中的4表示返回4行,9表示從表的第十行開始

    說一下我數據庫查詢這里的思路,因為逐步寫入EXCEL的數據實際上來自Mysql的分頁查詢,大家知道其語法是LIMIT offset, num 不過隨着offset越來越大Mysql在每次分頁查詢時需要跳過的行數就越多,這會嚴重影響Mysql查詢的效率(包括MongoDB這樣的NoSQL也是不建議skip掉多條來取結果集),所以我采用LastId的方式來做分頁查詢。這樣從后面開始查是不是就好一些了?通過ID分組來一個降序查 

建立索引,但是不是索引越多越好。

普通索引:對關鍵字沒有限制

唯一索引:要求記錄提供的關鍵字不能重復

主鍵索引:要求關鍵字唯一且不為null

可以嘗試在一個字段未建立索引時,根據該字段查詢的效率,然后對該字段建立索引(alter table 表名 add index(字段名)),同樣的SQL執行的效率,你會發現查詢效率會有明顯的提升(數據量越大越明顯)。
    mysql主從復制作用和原理
    一、什么是主從復制?
    主從復制,是用來建立一個和主數據庫完全一樣的數據庫環境,稱為從數據庫;主數據庫一般是准實時的業務數據庫
    二、主從復制的作用
    1、做數據的熱備,作為后備數據庫,主數據庫服務器故障后,可切換到從數據庫繼續工作,避免數據丟失。
    2、架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
    3、讀寫分離,使數據庫能支撐更大的並發。在報表中尤其重要。由於部分報表sql語句非常的慢,導致鎖表,影響前台服務。如果前台使用master,報表使用slave,那么報表sql將不會造成前台鎖,保證了前台速度。
    問題及解決方法
    mysql主從復制存在的問題:
    主庫宕機后,數據可能丟失
    從庫只有一個sql Thread,主庫寫壓力大,復制很可能延時
    解決方法:
    半同步復制---解決數據丟失的問題
    並行復制----解決從庫復制延遲的問題

    三、主從復制的原理
    1.數據庫有個bin-log二進制文件,記錄了所有sql語句。
    2.我們的目標就是把主數據庫的bin-log文件的sql語句復制過來。
    3.讓其在從數據的relay-log重做日志文件中再執行一次這些sql語句即可。
    4.下面的主從配置就是圍繞這個原理配置
    5.具體需要三個線程來操作:
    1.binlog輸出線程:每當有從庫連接到主庫的時候,主庫都會創建一個線程然后發送binlog內容到從庫。在從庫里,當復制開始的時候,從庫就會創建兩個線程進行處理:
    2.從庫I/O線程:當START SLAVE語句在從庫開始執行之后,從庫創建一個I/O線程,該線程連接到主庫並請求主庫發送binlog里面的更新記錄到從庫上。從庫I/O線程讀取主庫的binlog輸出線程發送的更新並拷貝這些更新到本地文件,其中包括relay log文件。
    3.從庫的SQL線程:從庫創建一個SQL線程,這個線程讀取從庫I/O線程寫到relay log的更新事件並執行。可以知道,對於每一個主從復制的連接,都有三個線程。擁有多個從庫的主庫為每一個連接到主庫的從庫創建一個binlog輸出線程,每一個從庫都有它自己的I/O線程和SQL線程。
主從復制如圖:

 

    原理圖2,幫助理解!

    步驟一:主庫db的更新事件(update、insert、delete)被寫到binlog
    步驟二:從庫發起連接,連接到主庫
    步驟三:此時主庫創建一個binlog dump thread線程,把binlog的內容發送到從庫
    步驟四:從庫啟動之后,創建一個I/O線程,讀取主庫傳過來的binlog內容並寫入到relay log.
    步驟五:還會創建一個SQL線程,從relay log里面讀取內容,從Exec_Master_Log_Pos位置開始執行讀取到的更新事件,將更新內容寫入到slave的db.

    優化網站性能 數據庫機構優化:
讀寫分離和分庫分表:隨着用戶量的增加,數據庫成為最大的瓶頸,改善數據庫性能常用的手段是進行讀寫分離以及分庫分表,讀寫分離顧名思義就是將數據庫分為讀庫和寫庫,通過主備功能實現數據同步。分庫分表則分為水平切分和垂直切分,水平切分則是對一個數據庫特大的表進行拆分,例如用戶表。垂直切分則是根據業務的不同來切分,如用戶業務、商品業務相關的表放在不同的數據庫中。

 

 

    還可以使用NoSql數據庫和搜索引擎來做到這個網站優化性能
    
對於海量數據的查詢和分析,我們使用nosql數據庫加上搜索引擎可以達到更好的性能。並不是所有的數據都要放在關系型數據中。常用的NOSQL有mongodb、hbase、redis,搜索引擎有lucene、solr、elasticsearch。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM