## MySQL專題五:sql優化
[TOC]
> 本文主要討論在數據庫等級上的優化方法,參考[數據庫等級上優化](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimize-overview.html)
### 5.1.SQL語句[優化](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/statement-optimization.html)
#### 5.1.1. 查詢SELECT語句優化
- 對`WHERE`子句中的Column考慮是否可以添加索引Index
- 使用LIKE子句時,避免使用通配符`%`作為字符串常量的開始,`LIKE %fun%`
#### 5.1.2. 插入INSERT語句優化
- 插入多條記錄時,使用多個VALUES列表一次插入,代替多條插入語句
如下面:
VALUES列表插入
~~~
INSERT INTO table0 ( field1, field2 )
VALUES
( value1, value2),
( value2, value3);
~~~
多條插入語句
~~~
INSERT INTO table0 ( field1, field2 )
VALUES ( value1, value2);
~~~
~~~
INSERT INTO table0 ( field1, field2 )
VALUES ( value2, value3);
~~~
- 從文本文件向表中插入數據時,使用[LOAD DATA](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/load-data.html),而不是插入[INSERT](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/insert.html)語句
- 列多使用缺省值,減少了MYSQL的轉換,僅當要插入的值與默認值不同時才顯式插入值
#### 5.1.3. 更新UPDATE語句優化
- 延遲更新,一次執行多個更新
### 5.2. 索引[優化](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimization-indexes.html)
建立索引加快了數據查詢的速度,如果一個索引都沒有,查詢一個數據就得**全表查找**,從表中第一個記錄查找,知道找到滿足條件的記錄或者到表中最后一個記錄也沒有找到滿足條件的記錄,全表查找時間隨著表的記錄增長會越來越長。
同時數據的插入、更新、刪除操作,索引都需要更新,因此需要找到一個平衡點,實現最佳索引查詢。
#### 5.2.1. Primary Key優化
Mysql默認會為Primary Key的Column建立索引
- 考慮重要字段作為主鍵
- 如果沒有明顯重要字段,考慮創建一個單獨的列并使用自動增長值作為主鍵
#### 5.2.2. Foreign Key優化
- 如果一張表中列很多,考慮將表中不常用的數據分離成一張或多張單獨的分表,并將主表中的主鍵復制到分表中。
### 5.3. 數據庫結構[優化](https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/optimizing-database-structure.html)
- 盡可能使用最小的數據類型,如MEDIUMINT通常是比INT更好的選擇,因為MEDIUMINT列使用的空間減少了25%
- 盡可能聲明列不為空,使用默認值代替
- 對于可以表示為字符串或數字的唯一id或其他值,首選的應該是數字列而不是字符串列
- 對于大小小于8KB的列值,請使用VARCHAR而不是BLOB
- 在InnoDB表中使用隨機生成的值作為主鍵時,如果可能的話,在它前面加上一個升序值,例如當前日期和時間。當連續的主值物理存儲在彼此附近時,InnoDB可以更快地插入和檢索它們
- 存儲包含文本數據的大blob時,考慮先壓縮數據
- JavaCook
- Java專題零:類的繼承
- Java專題一:數據類型
- Java專題二:相等與比較
- Java專題三:集合
- Java專題四:異常
- Java專題五:遍歷與迭代
- Java專題六:運算符
- Java專題七:正則表達式
- Java專題八:泛型
- Java專題九:反射
- Java專題九(1):反射
- Java專題九(2):動態代理
- Java專題十:日期與時間
- Java專題十一:IO與NIO
- Java專題十一(1):IO
- Java專題十一(2):NIO
- Java專題十二:網絡
- Java專題十三:并發編程
- Java專題十三(1):線程與線程池
- Java專題十三(2):線程安全與同步
- Java專題十三(3):內存模型、volatile、ThreadLocal
- Java專題十四:JDBC
- Java專題十五:日志
- Java專題十六:定時任務
- Java專題十七:JavaMail
- Java專題十八:注解
- Java專題十九:淺拷貝與深拷貝
- Java專題二十:設計模式
- Java專題二十一:序列化與反序列化
- 附加專題一:MySQL
- MySQL專題零:簡介
- MySQL專題一:安裝與連接
- MySQL專題二:DDL與DML語法
- MySQL專題三:工作原理
- MySQL專題四:InnoDB存儲引擎
- MySQL專題五:sql優化
- MySQL專題六:數據類型
- 附加專題二:Mybatis
- Mybatis專題零:簡介
- Mybatis專題一:配置文件
- Mybatis專題二:映射文件
- Mybatis專題三:動態SQL
- Mybatis專題四:源碼解析
- 附加專題三:Web編程
- Web專題零:HTTP協議
- Web專題一:Servlet
- Web專題二:Cookie與Session
- 附加專題四:Redis
- Redis專題一:數據類型
- Redis專題二:事務
- Redis專題三:key的過期
- Redis專題四:消息隊列
- Redis專題五:持久化