Menu
快讀
  • 旅遊
  • 生活
    • 美食
    • 寵物
    • 養生
    • 親子
  • 娛樂
    • 動漫
  • 時尚
  • 社會
  • 探索
  • 故事
  • 科技
  • 軍事
  • 国际
快讀

曆時七天,史上最強MySQL優化總結,從此優化So Easy

2021 年 3 月 11 日 行走的旅行箱

曆時七天,史上最強MySQL優化總結,從此優化So Easy

五、查詢緩存

1. 將select查詢結果緩存起來,key爲SQL語句,value爲查詢結果

如果SQL功能一樣,但只是多個空格或略微改動都會導致key的不匹配

2. 客戶端開啓

query. cache. _type

  • 0-不開啓
  • 1-開啓,默認緩存每條select,針對某個sq不緩存: select sql-no-cache
  • 2-開啓,默認都不緩存,通過select sql-cache制定緩存哪-個條

3. 客戶端設置緩存大小

query_ cache .size

4. 重蛋緩存

reset query cache

5. 緩存失效

日對數據表的改動會導致基 于該數據表的所有緩存失效(表層面的管理)

六、分區

1. 默認情況下一張表對應一組存儲文件,但當數據量較大時(通常千萬條級別)需要將數據分到多組存儲文件,保證單個文件的處理效率

2. partition by分區函數(分區字段)(分區邏輯)

  • hash-分區字段爲整型
  • key-分區字段爲字符串
  • range-基于比較,只支持less than
  • list-基于狀態值

3. 分區管理

  • 創建時分區:create table article0 partition by key(title) partitions 10
  • 修改表結構:alter table article add partition(分區邏輯)

4. 分區字段應選擇常用的檢素字段,否則分區意義不大

七、水平分割和垂直分割

1. 水平

多張結構相同的表存儲同一類型數據

單獨一張表保證id唯一性

2. 垂直

分割字段到多張表,這些表記錄是一對應關系

八、集群

1. 主從複制

①. 首先手動將slave和master同步一下

  • stop slave
  • master導出數據到slave執行一遍
  • show master status with read lock記錄File和Position
  • 到slave.上change master to

②. start slave查看Slave_ IO_ Running和Slave_ SQL_ _Running,必須都爲YES

③. master可讀可寫,但slave只能讀,否則主從複制會失效需要重新手動同步

④. mysqlreplicate快速配置主從複制

2. 讀寫分離(基于主從複制)

①. 使用原stcConecton

WriteDatabase提供寫連接

ReadDatabase提供讀連接

②. 借助Sping AOP和Aspec實現數據源動態切換

  • RoutingDataSourcelmpl extends AbstractRoutingDataSource,重寫determineDatasource,注入到SqISessionFactory, 配置defaultTargetDatasource和targetDatasource (根據determineDatasource的返回值選擇 具體數據源value-ref)
  • DatasourceAspect切面組件,配置切入點@Pointcut aspect0 (所有DAO類的所有方法),配置前置增強@Before(” aspect0″) before(Joinpoint point), 通過point.getSignature.getName獲取方法名,與METHOD TYPE MAP的前綴集合比對,將write/read設置到當前線程上(也是接下來要執行DAO方法的線程,前置增強將其攔截下來了)
  • DatasourceHandler,使用ThreadLocal在前置通知中將方法要使用的數據源綁定到執行該方法的線程上,執行方法要獲取數據源時再根據當前線程獲取

3. 負載均衡

算法

  • 輪詢
  • 加權輪詢
  • 依據負載情況

4. 高可用

爲單機服務提供一個冗余機

  • 心跳檢測
  • 虛IP
  • 主從複制

九、典型SQL

1. 線上DDL

爲了避免長時間表級鎖定

  • copy策略,逐行複制,記錄複制期間舊表SQL日志重新執行
  • mysq|5.6 online ddl,大大縮短鎖定時間

2. 批量導入

①. 先禁用索引和約束,導入之後統一建立

②. 避免逐條事務

innodb爲了保證一致性,默認爲每條SQL加事務(也是要耗費時間的),批量導入前應手動建立事務,導入完畢後手動提交事務。

3. limit offset,rows

避兔較大的offset (較大頁碼數)

offset用來跳過數據,完全可以用過濾篩選數據,而不是查出來之後再通過offset跳過

4. select *

盡量查詢所需字段,減少網絡傳輸延時(影響不大)

5. order by rand()

會爲每條數據生成一個隨機數最後根據隨機數排序,可以使用應用程序生成隨機主鍵代替

6. limit 1

如果確定了僅僅檢索一條數據,建議都加上limit 1

十、慢查詢日志

1. 定位查詢效率較低的SQL,針對性地做優化

2. 配置項

  • 開啓slow_ query. log
  • 臨界時間long_ query. time

3. 慢查詢日志會自己記錄超過臨界時間的SQL,並保存在datadir下的xxx-slow.log中

相關文章:

  • 「校長Harry」在新加坡包個海島過周末,So easy.
  • Индексы фондового рынка, международные, США, Европы, Азии
  • 無所不能的CAC委員會 CAC支持類部門介紹
  • 畢業旅行啦|新加坡5日親子遊,兩人帶娃so easy
  • 新加坡最棒的Beach Club大盤點~假裝度假so easy
  • 每周越新聞第07期 ∥新加坡如何管理優步打車?Singaporequản lý Uber, Grab
親子

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

©2026 快讀 | 服務協議 | DMCA | 聯繫我們