RD1
主索引鍵 ( primary key )
一個表中通常會有一個,而且只能有一個。
設定為主索引鍵的欄位值不可重複,而且不可儲存NULL值。
唯一索引 ( unique index )
也稱為「不可重複索引」,在一個表中,設定為唯一索引的欄位值不可以重複,
但是可以儲存NULL值。
非唯一索引 ( non-unique index )
用來增加查詢與維護資料效率的索引。
設定為非唯一索引的欄位值可以重複,也可以儲存NULL值。
全文檢索 ( full-text search)
只能用在「 CHAR 」、「 VARCHAR 」與「 TEXT 」型態的欄位字元型態
且允許NULL的欄位所組成。
搭配好幾個欄位做搜尋排序時,使用複合索引的效率比單一索引效率要高。
在建立複合索引時要考慮索引的先後順序,愈有識別性的欄位應該放在前面
ex. index_1(name, age, sex)
比 index_2(sex, name, age)
要有效率
最左前綴 ( Leftmost Prefixing ) 概念
創建複合索引 (A,B,C) 相當於創建一個單一索引 A 和兩個複合索引 A+B 與 A+B+C
最常見在「WHERE」子句中判斷條件的欄位,還有「 ORDER BY 」與「 GROUP BY 」中指定的欄位,也都可以使用建立索引來增加效率。
不過建立這樣的索引的前提,表格所儲存的資料量要夠大,如果量不大的話,建立索引反而會浪費儲存的空間,效率也增加不多,而且還會讓執行新增或修改時的效率變差。
在建立資料表同時建立分區,新增資料時按照分區條件劃入不同空間中。
是一種水平分區的方式,將同一個資料表的資料分成不同的檔案儲存,甚至可以放在不同磁碟,
查詢時針對特定分區執行,縮小範圍進而增加存取速度 (分區後所有的資料還是在同一張表)
採用哪種分區方式要取決於需求以及資料本身特性,如果選到不適合的分區方式,效能甚至會不進反退。
不同的分區方式,也有不同的維護方法,在決定方式前一定都要考量到。
資料以id依照範圍設定分為三個區
註:若用來分區的欄位不是主鍵,會出現錯誤訊息
專案:https://github.com/esther-lin069/go-mysql-api
A. DB執行時間:1.51620212s / 資料列數:2333
B. DB執行時間:10.3352946s / 資料列數:5041
A. DB執行時間:1.535088086s / 資料列數:2333
B. DB執行時間:10.9309112s / 資料列數:5041
A. DB執行時間:20.507707785s / 資料列數:2333
B. DB執行時間:1m34.1675092s / 資料列數:5041
A. DB執行時間:1.890655134s / 資料列數:2333
B. DB執行時間:23.2711352s / 資料列數:5041
A. DB執行時間:22.053848687s / 資料列數:2333
B. DB執行時間:2m59.8551417s / 資料列數:5041
A. DB執行時間:605.020578ms / 資料列數:2333
B. DB執行時間:9.133879s / 資料列數:5041
A容量狀態為:
A. DB執行時間:178.530348ms / 資料列數:2333
B. DB執行時間:3.100755s / 資料列數:5041
上述複合索引加上聊天室id的單索引
A. DB執行時間:176.098068ms / 資料列數:2333 (沒有明顯變化)
B.
A. DB執行時間:289.66093ms / 資料列數:2333
B. DB執行時間:5.4436063s / 資料列數:5041
A. DB執行時間:28.988757ms / 資料列數:2333
B. DB執行時間:278.2587ms / 資料列數:5041
A. DB執行時間:1.523979225s / 資料列數:2333
B. DB執行時間:10.6058784s / 資料列數:5041
(需要掃過所有資料,沒有效率的索引)
A. DB執行時間:33.912341ms / 資料列數:2333
B. DB執行時間:375.1045ms / 資料列數:5041
資料總筆數 5059044
DB執行時間:767.0391ms / 資料列數:2558 (比原始狀態快一倍)
DB執行時間:1.6681611s / 資料列數:2497 (跟原始狀態差不多)
DB執行時間:28.4168ms / 資料列數:2497
list的分組對象必須是int類型且為主鍵
資料總筆數 4958729
DB執行時間:1.7339688s / 資料列數:2396 (沒啥幫助)