mysql日常优化细节

# sql语句优化
>
1)使用limit限制一次性查询出的数据量
2)链接查询代替子查询
3)尽量不要使用select * ,将需要查找的字段列出来
4)如果数据量特别大的话尽量将一条复杂的sql拆分成多个sql完成功能
5)使用!=以及<>不等于的时候,mysql不使用索引

6) 在使用like的时候,以%开头,即"%***"的时候无法使用索引

7) 在使用or的时候,要求or前后字段都有索引

8) 超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;多表关联查询时,保证被关联的字段需要有索引。 说明:即使双表 join 也要注意表索引、SQL 性能

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越大,离散程度越高:

```
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;
```

 

... 持续补充中

posted @ 2018-05-30 18:49  JustTheWayIAm  阅读(181)  评论(0编辑  收藏  举报