温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

sql 优化

发布时间:2020-04-11 00:55:05 来源:网络 阅读:281 作者:月亮1987 栏目:关系型数据库

关系型数据库优化:
1.对数据结构优化,通过业务逻辑简化结构、数据结构、简化冗余字段
2.通过T-sql语句进行优化;包括sql语句的优化、建立索引、规范sql语句的书写(根据sql代码的执行原理)
3.金钱加成,添加服务器,分布式集群来解决问题
注释:业务逻辑上的优化,工作量比较大,要求业务和开发人员的密切配合,保证对每一个小细节的逻辑能解释清楚,所带来的风险也比较大,很多企业不会这么做,但是这也是最根本的解决性能问题;T-sql语句优化,要求技术性比较高,对数据原理和T-sql程序的基础比较了解;添加服务器方法,需要资金和相关运维人员;
今天就说说对T-sql代码的优化:
索引分类:
存储结构:聚簇索引,非聚簇索引
唯一性区分:唯一索引,非唯一索引
列个数:单列索引,多列索引
索引使用注意事项:
1)索引并不是越多越好,要根据查询有针对性的创建,考虑在 WHERE 和 ORDER BY 命令上涉及的列建立索引,可根据 EXPLAIN 来查看是否用了索引还是全表扫描。
2)应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
3)值分布很稀少的字段不适合建索引,例如“性别”这种只有两三个值的字段。
4)字符字段只建前缀索引。
5)字符字段最好不要做主键。
6)不用外键,由程序保证约束
7)尽量不用 UNIQUE,由程序保证约束。
8)使用多列索引时注意顺序和查询条件保持一致,同时删除不必要的单列索引。
聚集索引:每张表只能有一个聚集索引;一种对磁盘上实际数据重新组织以按指定的一列或多列值排序,是用平衡二叉树
非聚集索引:每张表可以有多个非聚集索引;默认情况下建立的索引是非聚集索引,他不重新组织表中的数据,而是对每一行存储索引列值并用一个指针指向数据所在的页面。每个非聚集索引根据索引列的不同提供不同的排序顺序。
索引设计原则:
1)系统一般会给逐渐字段自动建立聚集索引。
2)有大量重复值且经常有范围查询和排序、分组的列,或者经常频繁访问的列,考虑建立聚集索引。
3)在一个经常做插入操作的表中建立索引,应使用fillfactor(填充因子)来减少页分裂,同时提高并发度降低死锁的发生。如果在表为只读表,填充因子可设为100
4)在选择索引键时,尽可能采用小数据类型的列作为键以使每个索引页能容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必需遍历的索引页面降低到最小,此外,尽可能的使用整数做为键值,因为整数的访问速度最快。
Sql查询的逻辑执行顺序:
① From:对FROM子句中前两个表执行笛卡尔积生成虚拟表vt1
② On :对vt1表应用ON筛选器只有满足 为真的行才被插入vt2
③ Join:如果指定了 OUTER JOIN保留表(preserved table)中未找到的行将行作为外部行添加到vt2 生成t3如果from包含两个以上表则对上一个联结生成的结果表和下一个表重复执行步骤和步骤直接结束
④ Where :对vt3应用 WHERE 筛选器只有使 为true的行才被插入vt4
⑤ Group by :按GROUP BY子句中的列列表对vt4中的行分组生成vt5
⑥ With:
⑦ Having :对vt6应用HAVING筛选器只有使 为true的组才插入vt7
⑧ Select :处理select列表产生vt8
⑨ Distinct:将重复的行从vt8中去除产生vt9
⑩ Order by :将vt9的行按order by子句中的列列表排序生成一个游标vc10
⑪ Top :从vc10的开始处选择指定数量或比例的行生成vt11 并返回调用者
索引查找(seek),一般为最优(但查找也要看查找的筛选性),尽量吧where 条件中的字段建成一个组合索引,并且包含要查询select 中的字段。
需要你的条件可以用索引!比如 你的语句中 索引列不能带函数,不能参与计算如 where productID/2 = @a ,不能有隐式转换等!
最经典的例子就是where 和 having的区别,看过语句执行顺序你应该已经明白了。能写在where 中不要放在having中
横向来看:
不要写SELECT * 的语句,而是选择你需要的字段。
当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。
纵向来看:
where 条件要尽量的多且保证高筛选性。
业务中很常见要返回大批量数据到前端,但是这些数据真的都是必要的么?前端是否可以加一些默认条件呢?

Sql代码上层次上的优化:
分库:通过添加服务器,用硬件去分担数据带来的压力
分表:合理的利用服务器性能,服务器性能最优化,保证单表数据不会太大
想法:横向和纵向
横向:通过业务逻辑对模块进行分库划分,保证每一个模块的数据再不同的服务器上,独立运行
纵向:一个模块的数据表进行划分,保证每一张表数据不会太多,通过算法保证分表数据的平衡性
缺点:1.事务执行
2.数据关联和统计

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI