数据库优化

哈喽,大家好,我是指北君。

最近有兄弟想要了解数据库如何优化,那么它来了。

前言

1.百万级数据库优化方案

  1. 对查询进行优化,要尽量避免全表扫描,首先考虑在where,order by ,group by 的字段上加索引。

  2. 尽量避免在where子句中对字段进行null值判断,否则将导致引擎放弃使用索引,进行全表扫面。

  3. 尽量避免在where子句中使用!= 或者<> 操作符,否则将引擎放弃使用索引而进行全表扫面。

  4. 尽量避免在wher子句中使用or来连接条件,吐过一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引,导致全表扫描。

  5. in和 not in 要慎用,容易导致全表扫描,可以使用exist 代替in

  6. where子句中模糊查询使用前置匹配会导致全表扫面。

  7. 如果在where子句中使用参数也会导致全表扫面。

  8. 尽量避免在where子句中对字段进行函数操作。会导致全表扫描。

  9. 尽量避免在where子句中 “=” 的左边进行函数等表达式运算,否则会导致全表扫面/

  10. 使用索引字段为条件时,若为复合索引,那么必须使用到该索引中的第一个字段作为条件,这样才能保证索引被正确使用。

  11. 避免没有意义的查询。

  12. update语句尽量只更新必须的字段,减少性能消耗。

  13. 对于多张大数据表,join的时候,需要先分页再join,否则逻辑读会比较高,性能差。

  14. 索引并不是越多越好,一个表的索引最好不要超过6个。

  15. 尽量使用数字型字段,只含有数字的字段尽量不要设计为字符串,这会降低查询和连接的性能。

  16. 尽可能使用varchar/nvachar 代替 char/nchar 因为变长字段存储空间小,可以节省存储空间。较小的字段查询效率也更高一点。

  17. 任何地方都不要用select * from t。

  18. 避免频繁删除和创建临时表,减少系统表资源消耗。

  19. 新建临时表的时候,如果一次性插入数据量很大的话,可以使用select into 代替create table。

  20. 如果用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table 然后再drop table 。可以避免系统表的长时间锁定。

  21. 尽量避免使用游标。

  22. 尽量避免大事务操作,提高系统并发能力。

  23. 避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

  24. 拆分大的DELETE 和 insert 语句,应该批量执行这些SQL语句。

    ​ 避免为“大字段”创建索引。

    选择区分度大的字段作为索引。

    频繁增删改查的字段不要建立索引

    场景    
    使用OR连接查询条件。其中一个列没有索引    
    联合索引要遵循最左前缀原则    
    使用模糊查询的之后%开头也会导致索引失效    
    索引列使用了隐式转换也会导致索引失效    
Java Geek Tech wechat
欢迎订阅 Java 技术指北,这里分享关于 Java 的一切。