1、EXACT:

描述:字符串的比較

鑽石舞台 發表在 痞客邦 留言(0) 人氣()

階梯電價,是指把戶的用電量設置為若干個階梯,分段或分檔次定價計算費用。

具體計算方式為:

鑽石舞台 發表在 痞客邦 留言(0) 人氣()

1、根據出生年月計算年齡

如下圖所示,需要根據B列出生年月計算年齡,C2單元格公式為:

鑽石舞台 發表在 痞客邦 留言(0) 人氣()

大廠技術堅持周更精選好文

本文為來自 字節跳動-業務中台-前端團隊 成員的文章,已授權 ELab 發布。

前情概要

作為在該領域小白的我,在準備該主題分享之前,我信心滿滿的去知乎查了下,如何學習 WebGL?

鑽石舞台 發表在 痞客邦 留言(0) 人氣()

‍‍
作者 | Hollis
來源 | Hollis
一想到並發控制,很多人第一反應就是加鎖,的確,加鎖確實是解決並發問題最常見的方案。但是,其實除了加鎖以外,在數據庫領域,還有一種無鎖的方案可以來實現並發控制,那就是大名鼎鼎的MVCC。
MVCC,是Multiversion Concurrency Control的縮寫,翻譯過來是多版本並發控制,他也是一種並發控制的解決方案。
我們知道,在數據庫中,對數據的操作主要有2中,分別是讀和寫,而在並發場景下,就可能出現以下三種情況:
讀-讀並發
讀-寫並發
寫-寫並發
我們都知道,在沒有寫的情況下發讀-讀並是不會出現問題的,而寫-寫並發這種情況比較常用的就是通過加鎖的方式實現。那麼,讀-寫並發則可以通過MVCC的機制解決。本文就來介紹下一下MySQL中MVCC的實現機制。
‍‍

鑽石舞台 發表在 痞客邦 留言(0) 人氣()

大家好。今天是工作日星期四,快來看今天都有哪些值得我們技術人關注的重要新聞吧。

01國內要聞馬化騰稱之為「令人興奮的機會」,騰訊首次發布《全真互聯網白皮書》

鑽石舞台 發表在 痞客邦 留言(0) 人氣()

CSDN上有不少文章討論「為什麼你買了CSDN會員?到底值不值得?」有不少人這麼回答:
回答1:基本程序員都會用到一些開發工具、文檔教程、視頻教程,而CSDN會員里包含各種開發工具的免費下載權益,基本上日常用得到的都能找到。
之前是全網各種地方各種找,找的慢不說,而且質量參差不齊,自從有了會員,基本上幾分鐘就能找到想要的各種開發資料包。
回答2:在各種資料網站、論壇之間橫跳,但是發現還是離不開CSDN會員。
回答3:剛剛開始學編程,有了CSDN會員,各種技術方向的教程都可以免費看了!
而且想找文檔資料、代碼包直接一搜就出來,一年有好幾百次的下載機會,想下什麼資料都可以!
CSDN一直在致力於向用戶傳遞有獲得感的內容。很開心因為CSDN會員的存在幫助他們解決了各種各樣的問題,讓他們在使用CSDN會員權益的過程中有「值得」的感受。
今天,我們從上千萬的編程資料、學習視頻文檔中,幫大家整理了最受大家關注的一些榜單。
無論它是代碼包、文檔、還是視頻課程,在你的學習、工作中,都有可能會用到。

▲ 向左右滑動,查看更多榜單
而今天正好CSDN做活動有折扣。
CSDN會員為了讓更多知友加入,開啟了大促活動。
🎁 一重福利:買一年送三個月
原價 298 元每年,限時加贈三個月,即刻解鎖海量優質內容。
🎁 二重福利:抽獎好禮等你拿
完成購買即可參與抽獎領好禮!中獎率100%
蘋果耳機、羅技鍵盤、程序員日曆、現金紅包等你來拿!
🎁 三重福利:CSDN優惠券大放送
優惠券無門檻免費領!
限時折扣+優惠券,多種折扣享不停!
一起來成為【尊貴的CSDN會員】
超多優質內容、精彩權益享不停
承包你至少1年的編程資料

鑽石舞台 發表在 痞客邦 留言(0) 人氣()

作者 |撿田螺的小男孩
來源 |撿田螺的小男孩

前言

大家好,我是撿田螺的小男孩。
作為後端開發,我們經常需要設計數據庫表。整理了21個設計MySQL表的經驗準則,分享給大家,大家看完一定會有幫助的。
1.命名規範
數據庫表名、字段名、索引名等都需要命名規範,可讀性高(一般要求用英文),讓別人一看命名,就知道這個字段表示什麼意思。
比如一個表的賬號字段,反例如下:
acc_no,1_acc_no,zhanghao
正例:
account_no,account_number
表名、字段名必須使用小寫字母或者數字,禁止使用數字開頭,禁止使用拼音,並且一般不使用英文縮寫。
主鍵索引名為pk_字段名;唯一索引名為uk_字段名;普通索引名則為idx_字段名。
2.選擇合適的字段類型
設計表時,我們需要選擇合適的字段類型,比如:
儘可能選擇存儲空間小的字段類型,就好像數字類型的,從tinyint、smallint、int、bigint從左往右開始選擇
小數類型如金額,則選擇 decimal,禁止使用 float 和 double。
如果存儲的字符串長度幾乎相等,使用 char 定長字符串類型。
varchar是可變長字符串,不預先分配存儲空間,長度不要超過5000。
如果存儲的值太大,建議字段類型修改為text,同時抽出單獨一張表,用主鍵與之對應。
同一表中,所有varchar字段的長度加起來,不能大於65535. 如果有這樣的需求,請使用TEXT/LONGTEXT 類型。
3. 主鍵設計要合理
主鍵設計的話,最好不要與業務邏輯有所關聯。有些業務上的字段,比如身份證,雖然是唯一的,一些開發者喜歡用它來做主鍵,但是不是很建議哈。主鍵最好是毫無意義的一串獨立不重複的數字,比如UUID,又或者Auto_increment自增的主鍵,或者是雪花算法生成的主鍵等等;
4. 選擇合適的字段長度
先問大家一個問題,大家知道數據庫字段長度表示字符長度還是字節長度嘛?
其實在mysql中,varchar和char類型表示字符長度,而其他類型表示的長度都表示字節長度。比如char(10)表示字符長度是10,而bigint(4)表示顯示長度是4個字節,但是因為bigint實際長度是8個字節,所以bigint(4)的實際長度就是8個字節。
我們在設計表的時候,需要充分考慮一個字段的長度,比如一個用戶名字段(它的長度5~20個字符),你覺得應該設置多長呢?可以考慮設置為 username varchar(32)。字段長度一般設置為2的冪哈(也就是2的n次方)。』;
5,優先考慮邏輯刪除,而不是物理刪除
什麼是物理刪除?什麼是邏輯刪除?
物理刪除:把數據從硬盤中刪除,可釋放存儲空間
邏輯刪除:給數據添加一個字段,比如is_deleted,以標記該數據已經邏輯刪除。
物理刪除就是執行delete語句,如刪除account_no =『666』的賬戶信息SQL如下:
deletefromaccount_info_tabwhereaccount_no='666';
邏輯刪除呢,就是這樣:
updateaccount_info_tabsetis_deleted=1whereaccount_no='666';
為什麼推薦用邏輯刪除,不推薦物理刪除呢?
為什麼不推薦使用物理刪除,因為恢復數據很困難
物理刪除會使自增主鍵不再連續
核心業務表 的數據不建議做物理刪除,只適合做狀態變更。
6. 每個表都需要添加這幾個通用字段如主鍵、create_time、modifed_time等
表必備一般來說,或具備這幾個字段:
id:主鍵,一個表必須得有主鍵,必須
create_time:創建時間,必須
modifed_time/update_time: 修改時間,必須,更新記錄時,需要更新它
version : 數據記錄的版本號,用於樂觀鎖,非必須
remark :數據記錄備註,非必須
modified_by :修改人,非必須
creator :創建人,非必須
7. 一張表的字段不宜過多
我們建表的時候,要牢記,一張表的字段不宜過多哈,一般儘量不要超過20個字段哈。筆者記得上個公司,有夥伴設計開戶表,加了五十多個字段。。。
如果一張表的字段過多,表中保存的數據可能就會很大,查詢效率就會很低。因此,一張表不要設計太多字段哈,如果業務需求,實在需要很多字段,可以把一張大的表,拆成多張小的表,它們的主鍵相同即可。
當表的字段數非常多時,可以將表分成兩張表,一張作為條件查詢表,一張作為詳細內容表 (主要是為了性能考慮)。
8. 儘可能使用not null定義字段
如果沒有特殊的理由, 一般都建議將字段定義為 NOT NULL 。
為什麼呢?
首先, NOT NULL 可以防止出現空指針問題。
其次,NULL值存儲也需要額外的空間的,它也會導致比較運算更為複雜,使優化器難以優化SQL。
NULL值有可能會導致索引失效
如果將字段默認設置成一個空字符串或常量值並沒有什麼不同,且都不會影響到應用邏輯, 那就可以將這個字段設置為NOT NULL。
9. 設計表時,評估哪些字段需要加索引
首先,評估你的表數據量。如果你的表數據量只有一百幾十行,就沒有必要加索引。否則設計表的時候,如果有查詢條件的字段,一般就需要建立索引。但是索引也不能濫用:
索引也不要建得太多,一般單表索引個數不要超過5個。因為創建過多的索引,會降低寫得速度。
區分度不高的字段,不能加索引,如性別等
索引創建完後,還是要注意避免索引失效的情況,如使用mysql的內置函數,會導致索引失效的
索引過多的話,可以通過聯合索引的話方式來優化。然後的話,索引還有一些規則,如覆蓋索引,最左匹配原則等等。。
假設你新建一張用戶表,如下:
CREATETABLEuser_info_tab(`id`int(11)NOTNULLAUTO_INCREMENT,`user_id`int(11)NOTNULL,`age`int(11)DEFAULTNULL,`name`varchar(255)NOTNULL,`create_time`datetimeNOTNULL,`modifed_time`datetimeNOTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8;
對於這張表,很可能會有根據user_id或者name查詢用戶信息,並且,user_id是唯一的。因此,你是可以給user_id加上唯一索引,name加上普通索引。
CREATETABLEuser_info_tab(`id`int(11)NOTNULLAUTO_INCREMENT,`user_id`int(11)NOTNULL,`age`int(11)DEFAULTNULL,`name`varchar(255)NOTNULL,`create_time`datetimeNOTNULL,`modifed_time`datetimeNOTNULL,PRIMARYKEY(`id`),KEY`idx_name`(`name`)USINGBTREE,UNIQUEKEYun_user_id(user_id))ENGINE=InnoDBDEFAULTCHARSET=utf8;
10. 不需要嚴格遵守 3NF,通過業務字段冗餘來減少表關聯
什麼是數據庫三範式(3NF),大家是否還有印象嗎?
第一範式:對屬性的原子性,要求屬性具有原子性,不可再分解;
第二範式:對記錄的唯一性,要求記錄有唯一標識,即實體的唯一性,即不存在部分依賴;
第三方式:對字段的冗餘性,要求任何字段不能由其他字段派生出來,它要求字段沒有冗餘,即不存在傳遞依賴;
我們設計表及其字段之間的關係, 應儘量滿足第三範式。但是有時候,可以適當冗餘,來提高效率。比如以下這張表
商品名稱
商品型號
單價
數量
總金額
手機
華為
8000
5
40000
以上這張存放商品信息的基本表。總金額這個字段的存在,表明該表的設計不滿足第三範式,因為總金額可以由單價*數量得到,說明總金額是冗餘字段。但是,增加總金額這個冗餘字段,可以提高查詢統計的速度,這就是以空間換時間的作法。
當然,這只是個小例子哈,大家開發設計的時候,要結合具體業務分析哈。
11. 避免使用MySQL保留字
如果庫名、表名、字段名等屬性含有保留字時,SQL語句必須用反引號來引用屬性名稱,這將使得SQL語句書寫、SHELL腳本中變量的轉義等變得非常複雜。
因此,我們一般避免使用MySQL保留字,如select、interval、desc等等
12. 不搞外鍵關聯,一般都在代碼維護
什麼是外鍵呢?
外鍵,也叫FOREIGN KEY,它是用於將兩個表連接在一起的鍵。FOREIGN KEY是一個表中的一個字段(或字段集合),它引用另一個表中的PRIMARY KEY。它是用來保證數據的一致性和完整性的。
阿里的Java規範也有這麼一條:
【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。
我們為什麼不推薦使用外鍵呢?
使用外鍵存在性能問題、並發死鎖問題、使用起來不方便等等。每次做DELETE或者UPDATE都必須考慮外鍵約束,會導致開發的時候很難受,測試數據造數據也不方便。
還有一個場景不能使用外鍵,就是分庫分表。
13. 一般都選擇INNODB存儲引擎
建表是需要選擇存儲引擎的,我們一般都選擇INNODB存儲引擎,除非讀寫比率小於1%, 才考慮使用MyISAM 。
有些小夥伴可能會有疑惑,不是還有MEMORY等其他存儲引擎嗎?什麼時候使用它呢?其實其他存儲引擎一般除了都建議在DBA的指導下使用。
我們來複習一下這MySQL這三種存儲引擎的對比區別吧:
特性
INNODB
MyISAM
MEMORY
事務安全
支持
存儲限制
64TB
空間使用
內存使用
插入數據速度
是否支持外鍵
支持
14. 選擇合適統一的字符集。
數據庫庫、表、開發程序等都需要統一字符集,通常中英文環境用utf8。
MySQL支持的字符集有utf8、utf8mb4、GBK、latin1等。
utf8:支持中英文混合場景,國際通過,3個字節長度
utf8mb4: 完全兼容utf8,4個字節長度,一般存儲emoji表情需要用到它。
GBK :支持中文,但是不支持國際通用字符集,2個字節長度
latin1:MySQL默認字符集,1個字節長度
15. 如果你的數據庫字段是枚舉類型的,需要在comment注釋清楚
如果你設計的數據庫字段是枚舉類型的話,就需要在comment後面注釋清楚每個枚舉的意思,以便於維護
正例如下:
`session_status`varchar(2)COLLATEutf8_binNOTNULLCOMMENT'session授權態00:在線-授權態有效01:下線-授權態失效02:下線-主動退出03:下線-在別處被登錄'
反例:
`session_status`varchar(2)COLLATEutf8_binNOTNULLCOMMENT'session授權態'
並且,如果你的枚舉類型在未來的版本有增加修改的話,也需要同時維護到comment後面。
16.時間的類型選擇
我們設計表的時候,一般都需要加通用時間的字段,如create_time、modified_time等等。那對於時間的類型,我們該如何選擇呢?
對於MySQL來說,主要有date、datetime、time、timestamp 和 year。
date :表示的日期值, 格式yyyy-mm-dd,範圍1000-01-01 到 9999-12-31,3字節
time :表示的時間值,格式 hh:mm:ss,範圍-838:59:59 到 838:59:59,3字節
datetime:表示的日期時間值,格式yyyy-mm-dd hh:mm:ss,範圍1000-01-01 00:00:00到9999-12-31 23:59:59```,8字節,跟時區無關
timestamp:表示的時間戳值,格式為yyyymmddhhmmss,範圍1970-01-01 00:00:01到2038-01-19 03:14:07,4字節,跟時區有關
year:年份值,格式為yyyy。範圍1901到2155,1字節
推薦優先使用datetime類型來保存日期和時間,因為存儲範圍更大,且跟時區無關。
17. 不建議使用Stored procedure (包括存儲過程,觸發器) 。
什麼是存儲過程
已預編譯為一個可執行過程的一個或多個SQL語句。
什麼是觸發器
觸發器,指一段代碼,當觸發某個事件時,自動執行這些代碼。使用場景:
可以通過數據庫中的相關表實現級聯更改。
實時監控某張表中的某個字段的更改而需要做出相應的處理。
例如可以生成某些業務的編號。
注意不要濫用,否則會造成數據庫及應用程序的維護困難。
對於MYSQL來說,存儲過程、觸發器等還不是很成熟, 並沒有完善的出錯記錄處理,不建議使用。
18. 1:N 關係的設計
日常開發中,1對多的關係應該是非常常見的。比如一個班級有多個學生,一個部門有多個員工等等。這種的建表原則就是:在從表(N的這一方)創建一個字段,以字段作為外鍵指向主表(1的這一方)的主鍵。示意圖如下:
學生表是多(N)的一方,會有個字段class_id保存班級表的主鍵。當然,一班不加外鍵約束哈,只是單純保存這個關係而已。
有時候兩張表存在N:N關係時,我們應該消除這種關係。通過增加第三張表,把N:N修改為兩個 1:N。比如圖書和讀者,是一個典型的多對多的關係。一本書可以被多個讀者借,一個讀者又可以借多本書。我們就可以設計一個借書表,包含圖書表的主鍵,以及讀者的主鍵,以及借還標記等字段。
19. 大字段
設計表的時候,我們尤其需要關注一些大字段,即占用較多存儲空間的字段。比如用來記錄用戶評論的字段,又或者記錄博客內容的字段,又或者保存合同數據的字段。如果直接把表字段設計成text類型的話,就會浪費存儲空間,查詢效率也不好。
在MySQl中,這種方式保存的設計方案,其實是不太合理的。這種非常大的數據,可以保存到mongodb中,然後,在業務表保存對應mongodb的id即可。
這種設計思想類似於,我們表字段保存圖片時,為什麼不是保存圖片內容,而是直接保存圖片url即可。
20. 考慮是否需要分庫分表
什麼是分庫分表呢?
分庫:就是一個數據庫分成多個數據庫,部署到不同機器。
分表:就是一個數據庫表分成多個表。
我們在設計表的時候,其實可以提前估算一下,是否需要做分庫分表。比如一些用戶信息,未來可能數據量到達百萬設置千萬的話,就可以提前考慮分庫分表。
為什麼需要分庫分表: 數據量太大的話,SQL的查詢就會變慢。如果一個查詢SQL沒命中索引,千百萬數據量級別的表可能會拖垮整個數據庫。即使SQL命中了索引,如果表的數據量超過一千萬的話,查詢也是會明顯變慢的。這是因為索引一般是B+樹結構,數據千萬級別的話,B+樹的高度會增高,查詢就變慢啦。
分庫分表主要有水平拆分、垂直拆分的說法,拆分策略有range範圍、hash取模。而分庫分表主要有這些問題:
事務問題
跨庫關聯
排序問題
分頁問題
分布式ID
大家可以看下之前我這篇文章哈:我們為什麼要分庫分表?
21. sqL 編寫的一些優化經驗
最後的話,跟大家聊來一些寫SQL的經驗吧:
查詢SQL儘量不要使用select *,而是select具體字段
如果知道查詢結果只有一條或者只要最大/最小一條記錄,建議用limit 1
應儘量避免在where子句中使用or來連接條件
注意優化limit深分頁問題
使用where條件限定要查詢的數據,避免返回多餘的行
儘量避免在索引列上使用mysql的內置函數
應儘量避免在 where子句中對字段進行表達式操作
應儘量避免在where 子句中使用!=或<>操作符
使用聯合索引時,注意索引列的順序,一般遵循最左匹配原則。
對查詢進行優化,應考慮在where 及 order by涉及的列上建立索引
如果插入數據過多,考慮批量插入
在適當的時候,使用覆蓋索引
使用explain 分析你SQL的計劃

鑽石舞台 發表在 痞客邦 留言(0) 人氣()

作者 | 王啟隆
責編 |唐小引
出品 | 《新程序員》編輯部
數據庫是所有現代信息系統的支柱,打孔卡系統曾管理了 20 世紀的社會運作,而在計算機誕生之後,電子數據庫系統存儲和分析企業數據,影響着無數企業的決策。如今,社交媒體和物聯網的泛濫已經迎來了需要收集和分析海量數據的時代,在這一時代背景下,開源技術逐漸發展,開源數據庫軟件的靈活性和成本效益現在已經徹底改變了數據庫管理系統。世界上第一個開源數據庫管理系統,正是 1995 年的 MySQL。從那時起,開源數據庫管理有了許多改進和附加功能,使其成為當今許多企業的首選。
MySQL 之父 Michael 「Monty」 Widenius(以下稱為 Monty)是一位擁有四十多年編程經驗的開源大師,除了 MySQL 的創始人,他還擔任 Monty Program Ab(現為 MariaDB 基金會 )的創始人。已入花甲之年的 Monty 依然奮戰於代碼第一線,沒有退休打算,對於編程有着許多獨到的理解,他曾參與《新程序員 004》的訪談,為我們帶來了不少感悟和心得。
Monty和中國結緣已久,與中國數據庫行業也頗有淵源。這一次,CSDN有幸再次對話這位開源數據庫領域的引航者,他不但為我們帶來了對於開源技術蓬勃發展下的新時代數據庫領域的嶄新觀點,還為我們講述了一段艱苦卓絕的歷史,描繪了 MySQL 原班人馬如何在那五年間重新建立 MariaDB 並東山再起,最終超越 MySQL,超越了曾經的自我。
註:本文節選自《新程序員·005:開源深度指南&新金融背後的科技力量》,目前已開啟預售,歡迎大家點擊訂閱!

01和中國結緣的MySQL之父

《新程序員》:這是您第幾次到中國?這兒有給您留下什麼深刻的印象嗎?
Monty:我應該來中國十次左右了吧,而這一次待得最久,差不多快一個月了——遺憾的是,明天我就要離開了。在中國最令人難忘的事情,應該是這次旅程中在酒店隔離了十天;不過,作為一名程序員,我的日常無非就是每天醒來,打開電腦進行工作。隔離並沒有對我產生多少影響,反而因此少了許多外界的干擾。
Monty 攝於杭州
《新程序員》:很多 MariaDB 的優質代碼都來自中國開發者。您有什麼關於中國開發者的趣事分享嗎?
Monty:我非常喜歡和中國開發者交談,我曾和不少參與 MySQL 的中國工程師進行過討論,並讓他們能更輕鬆地加入到 MariaDB 的合作中。不得不說,中國開發者提供的代碼都很有趣,他們做的不僅僅是修複數據庫中的一些 Bug,有的時候他們會為整個項目帶來巨大的影響,所以我很期待未來能看到更多來自中國的代碼。至於具體聊起某一件趣事?事實上,我更想在未來的發布中逐漸分享這些中國開發者做出的貢獻。
《新程序員》:中國開源的發展可謂是有目共睹。您認為中國未來會在數據庫領域扮演什麼樣的角色?
Monty:以前的數據庫大多在美國活躍,而如今大多數的數據庫都活躍在中國。我認為中國開發者需要精益求精,勇於去創造少量的優質產品,而不是大量複製平庸的產品,中國需要更多像阿里雲和騰訊雲這樣的產品。此外,找到一種團隊協作的方式也是當務之急,以 MariaDB 舉例,MariaDB 由一個團隊管理,其他人可以圍繞這個數據庫進行補充,並在這個過程中進行合作;像這樣的協作方式,對每個人都有意義,也值得學習。正確的協作方式能事半功倍。
《新程序員》:如今也有不少中國開發者想了解開源數據庫領域,您有哪些對這些入門者的建議嗎?
Monty:任何行業新人在使用數據庫的過程中,總會發現某個自己感興趣的數據庫,從而產生與其合作的想法。那麼,想要入門,你首先要站在客戶或者公司的角度,為這個數據庫找到一些新的需求,然後花一些時間學習相關的知識,並研究和改善這些功能。當你與產品本身、產品背後的工程師以及基金會合作得越多,對於數據庫的了解就會在這些實踐之中增長,你的個人觀點也會在開發者社區中留傳下來。因此,去參與開源項目吧,實踐將使你成名,實踐是入門的第一步。
開源的好處就是,所有參與者的個人價值體現在其擁有的技能,而不是學位、背景和身份。在這種情況下,開源開發者用代碼和程序來證明自我,而公司將通過代碼的質量來決定自己是否想要僱傭一個人。因為開源的存在,開發者不用再了解自己的合作對象是男是女,在意彼此長相如何、來自何方。這就是開源最棒的地方,開源讓開發者只關注感興趣的人,讓人能在自己所處於的領域大放光彩。記住一件事:一名優秀的程序員,是很難被解僱的。

鑽石舞台 發表在 痞客邦 留言(0) 人氣()

作者:周蘿蔔 本文轉自公眾號:蘿蔔大雜燴

鑽石舞台 發表在 痞客邦 留言(0) 人氣()