# sql語句優化
>
1)使用limit限制一次性查詢出的數據量
2)連接查詢代替子查詢
3)儘可能不要使用select * ,將須要查找的字段列出來
4)若是數據量特別大的話儘可能將一條複雜的sql拆分紅多個sql完成功能
5)使用!=以及<>不等於的時候,mysql不使用索引mysql
6) 在使用like的時候,以%開頭,即"%***"的時候沒法使用索引sql
7) 在使用or的時候,要求or先後字段都有索引數據庫
8) 超過三個表禁止 join。須要 join 的字段,數據類型保持絕對一致;多表關聯查詢時,保證被關聯的字段須要有索引。 說明:即便雙表 join 也要注意表索引、SQL 性能session
9) 函數
# 選擇合適的數據類型性能
> (1)使用可存下數據的最小的數據類型,整型 < date,time < char,varchar < blob
(2)使用簡單的數據類型,整型比字符處理開銷更小,由於字符串的比較更復雜。如,int類型存儲時間類型,bigint類型轉ip函數
(3)使用合理的字段屬性長度,固定長度的表會更快。使用enum、char而不是varchar
(4)儘量使用not null定義字段
(5)儘可能少用text,非用不可最好分表優化
(6)狀態屬性最好用tinyint類型索引
# 選擇合適的索引列
> (1)查詢頻繁的列,在where,group by,order by,on從句中出現的列
(2)where條件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出現的列
(3)長度小的列,索引字段越小越好,由於數據庫的存儲單位是頁,一頁中能存下的數據越多越好
(4)離散度大(不一樣的值多)的列,放在聯合索引前面。查看離散度,經過統計不一樣的列值來實現,count越大,離散程度越高:ip
```
mysql> SELECT COUNT(DISTINCT column_name) FROM table_name;
```字符串
# 學會使用命令分析數據庫
## SHOW查看狀態
```
mysql> SHOW [SESSION|GLOBAL] STATUS LIKE '%Status_name%';
session(默認):取出當前窗口的執行
global:從mysql啓動到如今
```
> 查看查詢次數(插入次數com_insert、修改次數com_insert、刪除次數com_delete)
```
mysql> SHOW STATUS LIKE 'com_select';
```
> 查看鏈接數(登陸次數)
```
mysql> SHOW STATUS LIKE 'connections';
```
> 數據庫運行時間
```
mysql> SHOW STATUS LIKE 'uptime';
```
> 查看慢查詢次數
```
mysql> SHOW STATUS LIKE 'slow_queries';
```
> 查看索引使用的狀況:
```
mysql> SHOW STATUS LIKE 'handler_read%';
- handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。
- handler_read_rnd_next:這個值越高,說明查詢低效。
```
## 顯示系統變量
```
mysql> SHOW VARIABLES LIKE '%Variables_name%';
```
## 顯示InnoDB存儲引擎的狀態
```
mysql> SHOW ENGINE INNODB STATUS;
```
... 持續補充中