数据库使用过程中的注意事项

数据库使用过程中的注意事项:

1. 按需索取,拒绝 select *,规避以下问题:
* 无法索引覆盖,回表操作,增加 io;
* 额外的内存负担,大量冷数据灌入innodb_buufer_pool_size,降低查询命中率;
* 额外的网络传输开销;

2. UPDATE、 DELETE 操作不使用 LIMIT,必须走 WHERE 精准匹配,limit 是随机的,此类操作会导致数据出错;

3. 禁止使用INSERT INTO t_xxx VALUES(xxx),  必须显示指定插入的列属性,避免表结构变动导致数据出错;

4. 尽量避免使用大事务,建议大事务拆小事务,规避主从延迟;

5. 业务代码中事务及时提交,避免产生没必要的锁等待;

6. 少用多表 join,大表禁止 join,两张表 join 必须让小表做驱动表,join 列必须字符集一致并且都建有索引;

7. LIMIT 分页优化,LIMIT 80000,10 这种操作是取出 80010 条记录,再返回后 10 条,数据库压力很大,推荐先确首记录位置再分页,如:SELECT * FROM test WHERE id = ( SELECT sql_no_cache id FROM test order by id LIMIT 80000,1 ) LIMIT 10 ;

8. 避免多层子查询嵌套的 SQL 语句 MySQL5.5 之前的查询优化器把会把 in 改成 exists,走不到索引性,若外表很大则性能会很差;

9. SQL 语句中最常见的导致索引失效的情况需注意:
* 隐式类型转换,如索引 a 的类型是 varchar,SQL 语句写成 where a = 1;; varchar 变成了int ;
* 对索引列进行数学计算和函数等操作,例如,使用函数对日期列进行格式化处理;
* join 列字符集不统一;
* 多列排序顺序不一致问题,如索引是 (a,b),SQL 语句是 order by a b desclike;
* 模糊查询使用的时候对于字符型xxx%形式可以走到一些索引,其他情况都走不到索引;
* 使用了负方向查询(not,!=,not in 等)。

10  要尽量避免全表扫描
* like '%条件%'
* where 子句中使用 != 或 <> 操作符
* where 子句中使用 or 来连接条件
* in , not in 的不合理使用

* where 子句中对字段进行表达式操作

select id from t where num/2 = 100 ;
//改为
select id from t where num = 100*2;


参考: 
1.   https://cloud.tencent.com/document/product/236/13390#.E5.BA.93.E8.A1.A8.E8.AE.BE.E8.AE.A1.E8.A7.84.E8.8C.83

2. https://blog.csdn.net/wanbf123/article/details/78115376



你可能感兴趣的:(Database)