前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库优化

数据库优化

作者头像
用户7798898
发布2020-09-27 16:21:49
8790
发布2020-09-27 16:21:49
举报

、 数据库优化方案(百万级数据量)

  1. 对sql语句进行优化, 首先对where和order by涉及的列加索引。

  2.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。

  3. 尽量在sql中避免以下几种情况, 否则会导致索引失效。

    • 尽量避免在where子句中进行null值判断, 数据库中的值尽量保证都是非空的。备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
    代码语言:javascript
    复制
    select id from t where num = 0
    • 尽量避免在索引列使用 != 或 <> 操作符,
    • 尽量避免使用 or 来连接条件. 最好替换为union join select id from t where num = 10 union allselect id from t where Name = 'admin'
    代码语言:javascript
    复制
    select id from t where num=10 or Name = 'admin'
    • 尽量不使用 in 和 not in 替代方案:使用between select id from t where num between 1 and 3 或者exist select num from a where num in(select num from b) 替换为 select num from a where exists(select 1 from b where num=a.num)
    代码语言:javascript
    复制
    select id from t where num in(1,2,3) 
    • 尽量避免使用like 这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用: select * from employee where last_name like 'c%';
    代码语言:javascript
    复制
    select id from t where name like ‘%abc%’  
    • 尽量避免在 where子句中对字段进行表达式操作 应该为 select id from t wherenum = 100*2
    代码语言:javascript
    复制
    select id from t where num/2 = 100
    • 采用UNION ALL操作符替代UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如: 这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。 推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。 select * from gc_dfys union all select * from ls_jg_dfys
    代码语言:javascript
    复制
    select * from gc_dfys
    union
    select * from ls_jg_dfys
    • fa
代码语言:javascript
复制
select id from t where num is null
4. 使用连接(JOIN)来代替子查询

  5. count(*)和count(列) 哪个更快? 其实没有可比性. 看这篇文章https://www.cnblogs.com/Caucasian/p/7041061.html

  6. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

  7. 尽可能的使用 varchar/nvarchar代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

  8.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4. 使用连接(JOIN)来代替子查询
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档