阿里巴巴java開發手冊學習記錄,php版

一.編程規約前端

(一)命名風格sql

1.目錄使用小寫+下劃線 home,view,model,admin_view數據庫

2.
類 UpperCamelCase PhpMailer
方法 lowerCamelCase getUserName
屬性 lowerCamelCase tableName
函數 小寫字母和下劃線 get_client_ip
常量 所有大寫 PASSWORD編程

若是模塊、接口、類、方法使用了設計模式,在命名時需體現出具體模式。將設計模式體如今名字中,有利於閱讀者快速理解架構設計理念。設計模式

(二)代碼格式
1.
// 這是示例註釋,請注意在雙斜線以後有一個空格安全

2.
if else的語言結構 只在結束的地方換行
e.g.
if (flag == 1) {性能優化

System.out.println("world");

} else {架構

System.out.println("ok");

}ide

3.一行代碼不超過120字符,超過須要使用換行
單個方法的總行數不超過 80 行。函數

4.代碼邏輯分清紅花和綠葉,個性和共性,綠葉邏輯單獨出來成爲額外方法,使主幹代碼 更加清晰;共性邏輯抽取成爲共性方法,便於複用和維護。

(三)OOP規約
1.全部的覆寫方法,必須加@Override註解

2.任何類、方法、參數、變量,嚴控訪問範圍。過於寬泛的訪問範圍,不利於模塊解耦。
若是是一個 private 的方法,想刪除就刪除,但是一個 public 的 service
成員方法或成員變量,刪除一下,不得手心冒點汗嗎

3.避免出現重複的代碼(Don’t Repeat Yourself),即DRY原則

二.安全規約

1.用戶輸入的 SQL 參數嚴格使用參數綁定或者 METADATA 字段值限定,防止 SQL 注入,
禁止直接使用前端傳來的字符串拼接 SQL 訪問數據庫。

三.MySQL規約

(一) 建表規約
1.任何字段若是爲非負數,必須是 unsigned

2.表達是與否概念的字段,必須使用 is_xxx 的方式命名,數據類型是 unsigned tinyint ( 1表示是,0表示否)

3.表名不使用複數名詞,表名應該僅僅表示表裏面的實體內容,不該該表示實體數量

4.惟一索引名爲 uk_字段名,普通索引名則爲 idx_字段名。

5.小數類型爲 decimal,禁止使用 float 和 double。
//說明:float 和 double 在存儲的時候,存在精度損失的問題,極可能在值的比較時,獲得不 正確的結果。若是存儲的數據範圍超過 decimal 的範圍,建議將數據拆成整數和小數分開存儲

6.varchar 是可變長字符串,不預先分配存儲空間,長度不要超過 5000,若是存儲長度大於此值,定義字段類型爲 text,獨立出來一張表,用主鍵來對應,避免影響其它字段索引效率。

7.禁用保留字,如 desc、range、match、delayed desc//這個很容易誤用,之後換成descb

8.表必備三字段:id, gmt_create, gmt_modified。 說明:其中id必爲主鍵,類型爲bigint unsigned、單表時自增、步長爲1。gmt_create, gmt_modified 的類型均爲 datetime 類型,前者如今時表示主動建立,後者過去分詞表示被 動更新。//here

9.【推薦】單錶行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。

(二) 索引規約
1.業務上具備惟一特性的字段,即便是組合字段,也必須建成惟一索引。 說明:不要覺得惟一索引影響了 insert 速度,這個速度損耗能夠忽略,但提升查找速度是明 顯的;另外,即便在應用層作了很是完善的校驗和控制,只要沒有惟一索引,根據墨菲定律, 必然有髒數據產生。

2.超過三個表禁止 join。須要 join 的字段,數據類型保持絕對一致;多表關聯查詢時,保證被關聯的字段須要有索引。

3.利用覆蓋索引來進行查詢操做,來避免回表操做。
說明:若是一本書須要知道第 11 章是什麼標題,會翻開第 11 章對應的那一頁嗎?
目錄瀏覽一下就好,這個目錄就是起到覆蓋索引的做用。
//這個例子舉的很是很是的好,之後用書和目錄來理解索引和數據是個很是好的方式
//extra列會出現:using index

4.延遲關聯或者子查詢優化超多分頁場景。
說明:MySQL 並非跳過 offset 行,而是取 offset+N 行,而後返回放棄前 offset 行,返回 N 行,那當 offset 特別大的時候,效率就很是的低下,要麼控制返回的總頁數,要麼縮減對要放棄的offset行的獲取成本。
正例:先快速定位須要獲取的 id 段,而後再關聯:
SELECT a.* FROM 表 1 a, (select id from 表 1 where 條件 LIMIT 100000,20 ) b where a.id=b.id

5.在 varchar 字段上創建索引時,必須指定索引長度,不必對全字段創建索引,根據實際文本區分度決定索引長度便可。

6.SQL 性能優化的目標:至少要達到 range 級別,要求是 ref 級別,若是能夠是 consts 最好。
說明:
1)consts 單表中最多隻有一個匹配行(主鍵或者惟一索引),在優化階段便可讀取到數據。
2)ref 指的是使用普通的索引(normal index)。
3)range 對索引進行範圍檢索。

7.防止因字段類型不一樣形成的隱式轉換,致使索引失效。
select id from qs_video_update where bid = 73836918995;
select id from qs_video_update where bid = '73836918995';//explain一下天壤之別了

(三)sql語句1.count(*)就是 SQL92 定義 的標準統計行數的語法,跟數據庫無關,跟 NULL 和非 NULL 無關。 說明:count(*)會統計值爲 NULL 的行,而 count(列名)不會統計此列爲 NULL 值的行。

相關文章
相關標籤/搜索