数据库优化(sql 优化)

数据库优化

优化点:

  • sql 优化
  • 数据库表结构优化
  • 系统配置优化
  • 硬件优化

创建索引:

  • 创建索引可以给检索带来性能上的很大提升(当发现检索慢时首先想到的应该是建立索引)
  • 首先应该考虑在 where、order by 所涉及到的列上建立索引
  • 在经常需要检索的字段上建立索引,比如用户名、商品名等
  • 一个表的索引最好不要超过 6 个,索引固然可以提高检索效率,但同时也降低了 insert 和 update 的效率,因为 insert 或 update 时可能会重建索引
  • 对于建立了索引的表要尽可能的避免全表扫描,否则会使索引失效

sql 优化:

  • 应尽量避免在 where 子句中使用 != < > 操作符,否则将导致搜索引擎放弃使用索引而进行全表扫描(索引失效)
  • 应尽量避免在 where 子句中对 null 值判断,否则将导致索引失效。对于 select age from user where age = null 可以给 age 设置默认值0,修改为 select age from user where age = 0
  • 应尽量避免在 where 子句中 使用 or 连接条件,否则将导致索引失效。对于 select age from user where age = 10 or age = 20,可以修改为 select age from user where age = 10 union all select age from user where age = 20
  • 应尽量避免使用 in、not in,否则将导致索引失效。可替换为 between and
  • 应尽量避免使用 like ‘%str%’,否则将导致索引失效。但是 like 'str%'不会是索引失效
  • 应该尽量避免在 where 子句中对字段进行表达式操作,否则将导致索引失效。如 select age from user where age/2 = 20 可替换为 select age from user where age = 40
  • 应尽量避免在 where 子句中进行函数操作,否则将导致索引失效。如 select name from user where substring(name, 1, 3) = ‘abc’(查询名字以 abd 开头),可替换为 select name from user where name like ‘abc%’
  • 应尽量避免在 where 子句中的 = 左边进行函数、运算或其它表达式运算,否则将导致系统无法正确使用索引
  • 正确使用 exists 与 in。当查询 A 表,子查询 B 表,A 表的数量多于 B 表时可考虑使用 in,反之则使用 exists
  • 在使用索引作为条件时,如果索引为复合索引,那么必须使用索引中的第一个字段作为条件时才能正确使用该索引,否则将导致索引失效。且应尽可能使字段顺序与索引顺序一致
  • 尽量使用数字型字段,也就是字段值只有数字时将其设计为数字型字段,而不是字符型,这样会降低查询和连接的性能。因为系统在查询和连接时对于字符的比较是一个一个的比较,而数字只比较一次
  • 尽量使用 varchar 代替 char,因为存储空间会直接影响查询效率和性能开销
  • 任何时候都不要使用 select * ,可使用具体字段代替 *
  • 尽量避免使用游标,因为游标效率底
  • 尽量将多条 sql 语句压缩到一条 sql 中。因为每次 sql 执行前都会进行 网络连接、权限校验等,而这个过程是非常耗时的
  • 尽量使用 where 代替 having。因为 having 是先检索出所有记录再进行筛选,而 where 是在聚合前就进行筛选
  • 尽量使用表的别名。当查询需要进行多表连接时,用表的别名,这会减少解析时间
  • 对于 update 优化。如果值 update 一个两个字段则避免 update 全部字段,否则会造成明显的性能消耗,且会产生大量日志
  • 对于 insert 优化。新建临时表时,如果插入的记录特别多则可考虑使用 select into 代替 create table,效率高且不会产生大量日志,如果数据量小则先 create table,再 insert

@

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值