面試:聊聊sql優化(1)

數據庫優化方案:mysql

1.表的設計合理化(符合3NF)面試

2.添加適當索引(index)【四種:普通索引、主鍵索引、惟一索引、全文索引】sql

三、分表技術(水平分割、垂直分割)數據庫

四、讀寫分離編程

五、存儲過程【模塊化編程】緩存

六、對mysql配置優化【配置最大併發數my.ini,調整緩存大小】服務器

七、mysql服務器硬件升級網絡

八、定時的去清除不須要的數據,定時進行碎片整理(MyISAM)mysql優化

 

 

 

mysql優化我通常聽從五個原則:架構

  1. 減小數據訪問: 設置合理的字段類型,啓用壓縮,經過索引訪問等減小磁盤IO
  2. 返回更少的數據: 只返回須要的字段和數據分頁處理 減小磁盤io及網絡io
  3. 減小交互次數: 批量DML操做,函數存儲等減小數據鏈接次數
  4. 減小服務器CPU開銷: 儘可能減小數據庫排序操做,和全表查詢 減小cpu 內存佔用
  5. 利用更多資源: 使用表分區,能夠增長並行操做,更大限度利用cpu資源

sql語句常見的優化好比

  1. sql優化第一最基本的爲了最快的速度查詢到數據,減小消耗,儘可能避免全表查詢,首先考慮在where和order by字段上創建索引
  1. where子句條件 後不要使用!=和》《操做符,不然數據庫會放棄索引使用全表查詢
  1. 用like模糊查詢時不建議在查詢字段開頭或首尾兩端使用百分號,這也會致使字段放棄索引,全表查詢,能夠考慮百分號在查詢字段後面或者使用全文索引
  1. 在sql中直接使用計算表達式和函數,也會致使索引失敗,能夠在等號右邊計算
  1. 不要寫select * from 須要什麼字段返回什麼字段減小消耗
  1. 在sql語句中嵌套SQL查詢 ,不要使用iN 或者 not in 可使用 exists替代
  1. 對於複雜的查詢,可使用中間臨時表 暫存數據
  1. 查詢數據量大的表 會形成查詢緩慢。主要的緣由是掃描行數過多。這個時候能夠經過程序,分段分頁進行查詢,循環遍歷,將結果合併處理進行展現。
  • 要查詢100000到100050的數據
    SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY ID ASC) AS rowid,* FROM infoTab)t WHERE t.rowid > 100000 AND t.rowid <= 100050
  1. 對數據量較大的表,使用分區分表存儲
  1. 必定要按期維護數據表和優化索引,刪除空餘數據
  1. 儘可能使用數字型字段
    儘可能使用數字型字段,若只含數值信息的字段儘可能不要設計爲字符型,這會下降查詢和鏈接的性能,並會增長存儲開銷。這是由於引擎在處理查詢和鏈接時會 逐個比較字符串中每個字符,而對於數字型而言只須要比較一次就夠了。

面試題

大家有沒有作 MySQL 讀寫分離?如何實現 MySQL 的讀寫分離?MySQL 主從複製原理的是啥?如何解決 MySQL 主從同步的延時問題?

  1. 如何實現 MySQL 的讀寫分離?
    其實很簡單,就是基於主從複製架構,簡單來講,就搞一個主庫,掛多個從庫,而後咱們就單單只是寫主庫,而後主庫會自動把數據給同步到從庫上去。
  2. MySQL 主從複製原理的是啥? 主庫將變動寫入 binlog 日誌,而後從庫鏈接到主庫以後,從庫有一個 IO 線程,將主庫的 binlog 日誌拷貝到本身本地,寫入一個 relay 中繼日誌中。接着從庫中有一個 SQL 線程會從中繼日誌讀取 binlog,而後執行 binlog 日誌中的內容,也就是在本身本地再次執行一遍 SQL,這樣就能夠保證本身跟主庫的數據是同樣的。
相關文章
相關標籤/搜索