文章目錄
參考Java 開發手冊
1.常用的mysql函數
聚合函數:avg,sum,min,max,count
字符串: concat,format,replace,substr
日期: date,date_format,UNIX_TIMESTAMP(時間戳)
2.建表規約
- 遵守三大範式
- 不要用保留字段
- 適當的冗餘字段,提高查詢效率
- 表名字段名全用小寫,因爲linux區分大小寫
- 如果存儲的字符串長度幾乎相同,那麼可以用char
- 表必備三字段:id, create_time, update_time
3.索引
- 分爲普通索引、唯一索引、主鍵索引、全文索引
唯一索引與主鍵索引的區別在於,唯一索引可以爲空。
4.索引規約
- 唯一特性的表字段,都必須要建立索引
- 超過三個表禁止join
- sql優化,至少要是range < ref < consts
5.SQL 語句
- 不要用count(列名)代替count(*),count(列名)會忽略空值得行。
- 禁止使用存儲過程,存儲過程難以調試和擴展,更沒有移植性
- 不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。
6.ORM 映射
- 不使用*去查詢,去增加解析成本
- #{},#param# 不要使用${} 此種方式容易出現 SQL 注入
- 獲取新增後的行id:useGeneratedKeys=true, keyProperty=id
7.查詢慢,sql優化經驗、提高查詢效率
- 可以建立索引
- 通過redis來緩存數據到內存裏
- 單表容量超過2G的話,可以採取分表分庫
- 還可以採用讀寫分離
- 不使用count(*)
- 用exists代替in
8.什麼時候索引會失效
https://blog.csdn.net/u011277123/article/details/78904569
- 模糊查詢,如果前面帶了美元%,不使用索引,後面帶了%可以使用索引
- or 也不會使用索引,用union all替代
- 使用組合索引時,必須要包括第一個列,否則也會失效
- 字符串存的數字,數字也要加引號,否則索引也會失效
- 字段加運算符也不會使用索引
9.explain
查看select語句的執行效率,需要關注,table,type,possible_keys,key,rows,extra
-
type:
all<index<range < ref < consts
all : 遍歷全表,相當於沒有使用索引,
index:索引物理文件全掃描,速度非常慢
range: 範圍內索引
ref: 普通索引
consts:最多匹配一行(主鍵或唯一索引) -
Extra:備註
-
rows:
需要查詢的行數,並不是查詢出來的行數
10.mysql調優
- 選擇合適的存儲引擎
- 建立對應的索引,優化sql
- 開啓mysql查詢緩存,默認是關閉的,需要手動打開query_cache_type。
- 分表分庫,讀寫分離
11. mysql存儲引擎
12. mysql樂觀鎖與悲觀鎖
樂觀鎖: 認爲不會有人改數據,通過新增了一個字段version版本號來解決的。
悲觀鎖: 認爲會有人改數據,數據庫加for update。