主頁 > 軟體設計 > 性能優化專題 - MySql 性能優化 - 04 - MySql調優

性能優化專題 - MySql 性能優化 - 04 - MySql調優

2021-02-01 11:57:46 軟體設計

目錄導航

    • 前言
    • Undo-log與Redo-log
      • 案例
      • 當前讀、快照讀
      • Redo Log的落盤配置
    • MySQL配置優化
      • MySQL服務器引數型別
      • 快速定位MySql組態檔
      • MySQL記憶體引數配置
    • MySQL資料庫表設計
      • 三大范式
      • 資料庫表設計
    • 附錄 58同城軍規
      • 一、基礎規范
      • 二、命名規范
      • 三、表設計規范
      • 四、欄位設計規范
      • 五、索引設計規范
      • 六、SQL使用規范
    • 寫在最后

前言

性能優化專題共計四個部分,分別是:

  • Tomcat 性能優化
  • MySql 性能優化
  • JVM 性能優化
  • 性能測驗

本節是性能優化專題第二部分 —— MySql 性能優化篇,共計四個小節,分別是:

  1. MySql索引機制
  2. MySql運行機理
  3. 深入理解InnoDB
  4. MySql調優

本節重點:

? MVCC + Undo Log,解決幻讀
? Redo Log的落盤配置
? ?如何尋找MySQL組態檔
? ? MySQL記憶體引數如何配置
? ? MySQL資料庫設計三大范式

Undo-log與Redo-log

回顧上一小節末尾的SQL案例,似乎是MVCC沒有解決幻讀問題,實際上MySQL還有Undo-log機制用來處理幻讀,默認的Innodb在REPEATABLE READ隔離級別下,是如何通過MVCC + Undo Log,解決幻讀的呢?

Undo Log :Undo log指事務開始之前,在操作任何資料之前,首先將需操作的資料備份到一個地方 (Undo Log)

undo意為取消,以撤銷操作為目的,回傳指定某個狀態的操作

  • UndoLog是為了實作事務的原子性而出現的產物

? 事務處理程序中如果出現了錯誤或者用戶執行了 ROLLBACK陳述句,MySQL可以利用Undo Log中的備份將資料恢復到事務開始之前的狀態

  • Undo Log在MySQL Innodb存盤引擎中用來實作多版本并發控制

? 事務未提交之前,Undo保存了未提交之前的版本資料,Undo 中的資料可作為資料舊版本快照供其他并發事務進行快照讀

案例

如下圖

  1. 事務A 執行update之前,備份數舊資料 --> Undo buffer -->落地 Undo Log
  2. 事務B 此時查詢的是Undo buffer中的內容(相當于讀取的是快照,實作多版本并發控制)
  3. 事務A 若因意外rollback,會從Undo buffer中資料恢復(實作事務原子性)

在這里插入圖片描述

當前讀、快照讀

快照讀

? SQL讀取的資料是快照版本,也就是歷史版本,普通的SELECT就是快照讀Innodb快照讀,資料的讀取將由 cache(原本資料) + undo(事務修改過的資料) 兩部分組成

當前讀

? SQL讀取的資料是最新版本,通過鎖機制來保證讀取的資料無法通過其他事務進行修改
UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE都是當前讀

Redo Log的落盤配置

? 指定Redo log 記錄在{datadir}/ib_logfile1&ib_logfile2 可通過innodb_log_group_home_dir 配置指定目錄存盤

mysql> show variables like "innodb_log_group_home_dir";
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_group_home_dir | ./    |
+---------------------------+-------+
1 row in set (0.01 sec)

一旦事務成功提交且資料持久化落盤之后,此時Redo log中的對應事務資料記錄就失去了意義,所以Redo log的寫入是日志檔案回圈寫入的

指定Redo log日志檔案組中的數量 innodb_log_files_in_group 默認為2

mysql> show variables like "innodb_log_files_in_group";
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| innodb_log_group_home_dir | 2     |
+---------------------------+-------+
1 row in set (0.01 sec)

指定Redo log每一個日志檔案最大存盤量innodb_log_file_size 默認48M

mysql> show variables like "innodb_log_files_in_group";
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| innodb_log_group_home_dir |10485760|
+---------------------------+--------+
1 row in set (0.01 sec)

指定Redo log在cache/buffer中的buffer池大小innodb_log_buffer_size 默認16M

mysql> show variables like "innodb_log_buffer_size";
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| innodb_log_group_home_dir |10485760|
+---------------------------+--------+
1 row in set (0.01 sec)

Redo buffer 持久化Redo log的策略Innodb_flush_log_at_trx_commit

mysql> show variables like "Innodb_flush_log_at_trx_commit";
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 0     |
+--------------------------------+-------+
1 row in set (0.01 sec)
  • 取值 0 每秒提交 Redo buffer --> Redo log OS cache -->flush cache to disk[可能丟失一秒內的事務資料]
  • 取值 1 默認值,每次事務提交執行Redo buffer --> Redo log OS cache --> flush cache to disk[最安全,性能最差的方式]
  • 取值 2 每次事務提交執行Redo buffer --> Redo log OS cache 再每一秒執行 --> flush cache to disk操作

MySQL配置優化

MySQL服務器引數型別

基于引數的作用域:

set global autocommit = ON/OFF;
-- 全域引數
set session autocommit = ON/OFF;
-- 會話引數(會話引數不單獨設定則會采用全域引數)

注意:

  • 全域引數的設定對于已經存在的會話無法生效
  • 會話引數的設定隨著會話的銷毀而失效
  • 全域類的統一配置建議配置在默認組態檔中,否則重啟服務會導致配置失效

快速定位MySql組態檔

假如剛進公司,boss丟了一個服務給你,讓你去優化一下MySQL的配置,只需要執行命令

mysql --help
# 尋找組態檔的位置和加載順序

這里給出一個通過管道過濾,干凈地過濾掉其他資訊,從而只保留MySql組態檔資訊的命令:

mysql --help | grep -A 1 'Default options are read from the following files in the given order'

演示效果:

[root@localhost mysql]# mysql --help | grep -A 1 'Default options are read from the following files in the given order'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf 
[root@localhost mysql]# 

當然,如果記不住怎么多,只需要記住mysql --help 即可,

常見的全域組態檔配置

port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/mysql
datadir = /data/mysql
pid-file = /data/mysql/mysql.pid
user = mysql
bind-address = 0.0.0.0
max_connections=2000
lower_case_table_names = 0 #表名區分大小寫
server-id = 1
tmp_table_size=16M
transaction_isolation = REPEATABLE-READ
ready_only=1

MySQL記憶體引數配置

每一個connection記憶體引數配置:

  • sort_buffer_size connection排序緩沖區大小
    ? 建議256K(默認值)-> 2M之內(若配置為2M)
    ? 當查詢陳述句中有需要檔案排序功能時,馬上為connection分配配置的記憶體大小(2M)

  • join_buffer_size connection關聯查詢緩沖區大小
    ? 建議256K(默認值)-> 1M之內
    ? 當查詢陳述句中有關聯查詢時,馬上分配配置大小的記憶體用這個關聯查詢,所以有可能在一個查詢陳述句中會分配很多個關聯查詢緩沖區

上述配置4000連接占用記憶體:

4000((256k/1024)M + (256K/1024)M) ~= 2G*

Innodb_buffer_pool_size
Innodb buffer/cache的大小(默認128M)

Innodb_buffer_pool

  • 資料快取
  • 索引快取
  • 緩沖資料
  • 內部結構

大的緩沖池可以減小多次磁盤I/O訪問相同的表資料以提高性能
參考計算公式:

Innodb_buffer_pool_size = (總物理記憶體 - 系統運行所用 - connection 所用) 90%*

wait_timeout
服務器關閉非互動連接之前等待活動的秒數

innodb_open_files
限制Innodb能打開的表的個數

innodb_write_io_threadsinnodb_read_io_threads
?Innodb使用后臺執行緒處理innodb緩沖區資料頁上的讀寫 I/O(輸入輸出)請求

innodb_lock_wait_timeout
?InnoDB事務在被回滾之前可以等待一個鎖定的超時秒數

更多配置詳見此貼:

https://www.cnblogs.com/wyy123/p/6092976.html

MySQL資料庫表設計

? 資料庫設計(Database Design)是指對于一個給定的應用環境,構造最優的資料庫模式,建立資料庫及其應用系統,使之能夠有效地存盤資料,滿足各種用戶的應用需求(資訊要求和處理要求),在資料庫領域內,常常把使用資料庫的各類系統統稱為資料庫應用系統

三大范式

第一范式( 1NF)
? 欄位具有原子性,不可再分, 所有關系型資料庫系統都滿足第一范式)資料庫表中的欄位都是單一屬性的, 不可再分;

第二范式( 2NF)
? 要求物體的屬性完全依賴于主鍵, 所謂完全依賴是指不能存在僅依賴主鍵一部分的屬性,如果存在, 那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的物體, 新物體與原物體之間是一對多的關系,為實作區分通常需要為表加上一個列,以存盤各個實體的惟一標識,簡而言之, 第二范式就是屬性完全依賴主鍵,

第三范式( 3NF)
? 滿足第三范式( 3NF) 必須先滿足第二范式( 2NF), 簡而言之, 第三范式( 3NF)要求一個資料庫表中不包含已在其它表中已包含的非主鍵資訊,

簡單一點:

  • 每一列只有一個單一的值,不可再拆分
  • 每一行都有主鍵能進行區分
  • 每一個表都不包含其他表已經包含的非主鍵資訊,

資料庫表設計

充分的滿足第一范式設計將為表建立太量的列

? 資料從磁盤到緩沖區,緩沖區臟頁到磁盤進行持久的程序中,列的數量過多會導致性能下降,過多的列影響轉換和持久的性能

過分的滿足第三范式化造成了太多的表關聯

? 表的關聯操作將帶來額外的記憶體和性能開銷

使用innodb引擎的外鍵關系進行資料的完整性保證

? 外鍵表中資料的修改會導致Innodb引擎對外鍵約束進行檢查,就帶來了額外的開銷,一般資料庫不用外鍵,外鍵邏輯在業務層控制

舉個案例,想一想下面的SQL如何優化

SELECT
*
FROM
order
WHERE
(convert((price_full * 100 - price * 100) , SIGNED) - convert(coupon_price*100,SIGNED)
AND
is_del = 0)
ORDER BY
id
desc
limit 100

問題:在where條件,對索引列計算,會讓索引失效,從而掃描全表,性能比較差

優化:(僅供參考)

? 假如(convert((price_full * 100 - price * 100) , SIGNED) - convert(coupon_price*100,SIGNED)沒有優化的余地,那這條SQL無法拯救了嘛?

? 可以在該表添加一個列(成本列),把這個條件的運算結果在insert之前計算好結果(假設新增之后,price_full、price、coupon_price列不會頻繁更新),放入表中,然后對添加的這個成本列和is_del 建一個聯合索引,把查詢消耗的時間成本轉移到了新增,這也只是一個方案,實際還要看具體的業務場景,技術服務于業務,

附錄 58同城軍規

軍規適用場景:并發量大、資料量大的互聯網業務
軍規:介紹內容
解讀:講解原因,解讀比軍規更重要

一、基礎規范

  1. 必須使用InnoDB存盤引擎
    解讀:支持事務、行級鎖、并發性能更好、CPU及記憶體快取頁優化使得資源利用率更高

  2. 必須使用UTF8字符集 UTF-8MB4
    解讀:萬國碼,無需轉碼,無亂碼風險,節省空間

  3. 資料表、資料欄位必須加入中文注釋
    解讀:N年后誰tm知道這個r1,r2,r3欄位是干嘛的

  4. 禁止使用存盤程序、視圖、觸發器、Event
    解讀:高并發大資料的互聯網業務,架構設計思路是“解放資料庫CPU,將計算轉移到服務
    層”,并發量大的情況下,這些功能很可能將資料庫拖死,業務邏輯放到服務層具備更好的
    擴展性,能夠輕易實作“增機器就加性能”,資料庫擅長存盤與索引,CPU計算還是上移吧

  5. 禁止存盤大檔案或者大照片
    解讀:為何要讓資料庫做它不擅長的事情?大檔案和照片存盤在檔案系統,資料庫里存URI
    多好

二、命名規范

  1. 只允許使用內網域名,而不是ip連接資料庫

  2. 線上環境、開發環境、測驗環境資料庫內網域名遵循命名規范
    業務名稱:xxx
    線上環境:dj.xxx.db
    開發環境:dj.xxx.rdb
    測驗環境:dj.xxx.tdb
    從庫在名稱后加-s標識,備庫在名稱后加-ss標識
    線上從庫:dj.xxx-s.db
    線上備庫:dj.xxx-sss.db

  3. 庫名、表名、欄位名:小寫,下劃線風格,不超過32個字符,必須見名知意,禁止
    拼音英文混用

  4. 表名t_xxx,非唯一索引名idx_xxx,唯一索引名uniq_xxx

三、表設計規范

  1. 單實體表數目必須小于500

  2. 單表列數目必須小于30

  3. 表必須有主鍵,例如自增主鍵
    解讀:

  • 主鍵遞增,資料行寫入可以提高插入性能,可以避免page分裂,減少表碎片提升空間和
    記憶體的使用
  • 主鍵要選擇較短的資料型別, Innodb引擎普通索引都會保存主鍵的值,較短的資料類
    型可以有效的減少索引的磁盤空間,提高索引的快取效率
  • 無主鍵的表洗掉,在row模式的主從架構,會導致備庫夯住
  1. 禁止使用外鍵,如果有外鍵完整性約束,需要應用程式控制
    解讀:外鍵會導致表與表之間耦合,update與delete操作都會涉及相關聯的表,十分影響
    sql 的性能,甚至會造成死鎖,高并發情況下容易造成資料庫性能,大資料高并發業務場景
    資料庫使用以性能優先

四、欄位設計規范

  1. 必須把欄位定義為NOT NULL并且提供默認值
    解讀:
  • null的列使索引/索引統計/值比較都更加復雜,對MySQL來說更難優化
  • null 這種型別MySQL內部需要進行特殊處理,增加資料庫處理記錄的復雜性;同等條
    件下,表中有較多空欄位的時候,資料庫的處理性能會降低很多
  • null值需要更多的存盤空,無論是表還是索引中每行中的null的列都需要額外的空間來標
  • 對null 的處理時候,只能采用is null或is not null,而不能采用=、in、<、<>、!=、
    not in這些運算子號,如:where name!=’zhangsan’,如果存在name為null值的記
    錄,查詢結果就不會包含name為null值的記錄
  1. 禁止使用TEXT、BLOB型別
    解讀:會浪費更多的磁盤和記憶體空間,非必要的大量的大欄位查詢會淘汰掉熱資料,導致內
    存命中率急劇降低,影響資料庫性能

  2. 禁止使用小數存盤貨幣
    解讀:使用整數吧,小數容易導致錢對不上

  3. 必須使用varchar(20)存盤手機號
    解讀:

  • 涉及到區號或者國家代號,可能出現±()
  • 手機號會去做數學運算么?
  • varchar可以支持模糊查詢,例如:like“138%”
  1. 禁止使用ENUM,可使用TINYINT代替
    解讀:
  • 增加新的ENUM值要做DDL操作
  • ENUM的內部實際存盤就是整數,你以為自己定義的是字串?

五、索引設計規范

  1. 單表索引建議控制在5個以內

  2. 單索引欄位數不允許超過5個
    解讀:欄位超過5個時,實際已經起不到有效過濾資料的作用了

  3. 禁止在更新十分頻繁、區分度不高的屬性上建立索引
    解讀:

  • 更新會變更B+樹,更新頻繁的欄位建立索引會大大降低資料庫性能
  • “性別”這種區分度不大的屬性,建立索引是沒有什么意義的,不能有效過濾資料,性
    能與全表掃描類似
  1. 建立組合索引,必須把區分度高的欄位放在前面
    解讀:能夠更加有效的過濾資料

六、SQL使用規范

  1. 禁止使用SELECT *,只獲取必要的欄位,需要顯示說明列屬性
    解讀:
  • 讀取不需要的列會增加CPU、IO、NET消耗
  • 不能有效的利用覆寫索引
  1. 解讀:容易在增加或者洗掉欄位后出現程式BUG

  2. 禁止使用屬性隱式轉換
    解讀:SELECT uid FROM t_user WHERE phone=110 會導致全表掃描,而不
    能命中phone索引

  3. 禁止在WHERE條件的屬性上使用函式或者運算式
    解讀:SELECT uid FROM t_user WHERE from_unixtime(day)>=‘2021-01-31’ 會導致全
    表掃描
    正確的寫法是:

SELECT uid FROM t_user WHERE day>= unix_timestamp(‘2021-01-31
00:00:00’)
  1. 禁止負向查詢,以及%開頭的模糊查詢
    解讀:
  • 負向查詢條件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,會導致全表掃描
  • %開頭的模糊查詢,會導致全表掃描
  1. 禁止大表使用JOIN查詢,禁止大表使用子查詢
    解讀:會產生臨時表,消耗較多記憶體與CPU,極大影響資料庫性能

  2. 禁止使用OR條件,必須改為IN查詢
    解讀:舊版本Mysql的OR查詢是不能命中索引的,即使能命中索引,為何要讓資料庫耗費
    更多的CPU幫助實施查詢優化呢?

  3. 應用程式必須捕獲SQL例外,并有相應處理
    總結:大資料量高并發的互聯網業務,極大影響資料庫性能的都不讓用,不讓用喲,

還可以多看看阿里巴巴開發手冊終極版中的關于MySQL部分的

點擊下載《阿里巴巴開發手冊終極版》

寫在最后

更多架構知識,歡迎關注本套系列文章:Java架構師成長之路

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/255187.html

標籤:其他

上一篇:基于ArcGIS Pro SDK的開發定制

下一篇:Echarts原始碼閱讀指南

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more