[TOC]
> [msql 優化的詳細方法](https://segmentfault.com/a/1190000006158186)
## 數據庫的優化
數據庫的緩存(memcache 緩存,redis 緩存等)
分庫分表、分區操作
讀寫分離
負載均衡
## 數據表數據類型優化
### 字段使用什么樣的數據類型更合適
tinyint (0-255) smallint , bigint
char,vachar
enum 特定、固定的分類可以使用enUm存儲,效率更快
IP地址的存儲 //用 php 的 `ip2long('192.168.1.38'); //3232235814`
對字段進行 not null 這樣,存儲的字段就不會有 null 值 ,只有空值
### 索引優化
索引不是越多越好,在合適的字段上創建合適的索引
復合索引的前綴原則
復合索引的前綴原則
lke查詢%的問題(% 在前如:`%name` 則索引失敗)
全表掃描優化
or條件索引使用情況
字符串類型索引失效的問題(如字符串類型的字段必須要加引號查詢)
### SQL語句的優化
優化查詢過程中的數據訪問
優化長難句的查詢語句
優化特定類型的查詢語句
使用 Limit
返回列不用*
變復雜為簡單
切分查詢(如刪大量數據時,可分多次刪除)
分解關聯查詢
優化 count() (如對統計數據單獨存放在一個字段,而不是進行 count() 統計)
優化關聯查詢
優化子查詢
優化 Group by和 distinct
優化 limit和 union
### 存儲引擎優化
盡量使用 Inno DB存儲引擎
### 數據表結構設計的優化
#### 分區操作
通過特定的策略對數據表進行物理拆分
對用戶透明
partition by
對新建表進行分區
```
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
```
對已有表進行分區
```
ALTER TABLE user PARTITION BY RANGE (id)
(
PARTITION p_Apr VALUES LESS THAN (2),
PARTITION p_May VALUES LESS THAN (4),
PARTITION p_Dec VALUES LESS THAN MAXVALUE
);
```
#### 分庫分表
水平拆分
垂直拆分
### 數據庫服務器架構的優化
- 主從復制
- 讀寫分離
- 雙主熱備
- 負載均衡:
通過LVS的三種基本模式實現負載均衡
My Cat數據庫中間件實現負載均衡