首页 > 数据库 > 国内数据库 > 「分布式技术专题」SQL优化的前置条件和优化技巧分享
SQL优化是数据库优化的一部分,数据库优化又是系统优化的一部分。本篇着重讲解 SQL优化的一些技巧 ,另外, 硬件基础、业务类型、存储结构也是影响SQL执行效率的重要因素,是SQL优化的前置条件。
数据库是操作系统之上的一种数据管理软件,其SQL最终的执行还是需要在硬件层面执行,所以硬件条件如CPU核数、内存大小、磁盘转速、网络带宽等是保障数据库的SQL脚本能快速运行的基础。
数据的存储结构和数据查询的效率是密切相关的。
在传统的关系型数据库中,分库分表是数据体量较大时一种常用的解决方式。
在分布式数据库中,集群节点可以线性扩展,分区分桶即可实现数据按某一维度分散存储。
对于OLAP的统计分析型的业务,列存是优先的存储格式; 对于OLTP的事务及高并发业务,行存则占据优势。
无论列存还是行存,如果数据存储时能够压缩,则可节省大量的存储空间,进行SQL查询时,也可大大减少IO,加快查询速度。
本质上来说,索引是一种空间换时间的策略,通过索引减少全表扫描,能大大降低IO,提高查询速度。但同时也会牺牲一定的更新速度。
• 单列索引
• 多列索引
• 唯一索引
• 非唯一索引
• 函数索引
• 分区索引
• 非分区索引
• B树
• 位图索引
• 哈希索引
空间上的代价
每建立一个索引都要为它建立一个数据页
时间上的代价
增删改查都要对索引同步操作
为查询频率高的字段创建索引
为经常需要排序、分组和联合操作的字段建立索引
选择区分度高的列作为索引
例如电话、身份证号码基本唯一,适合做索引,但性别不适合做索引
使用数据类型占用空间小的字段做索引
一般来说,数字类型、日期类型、char类型的字段适合做索引;字符串和BLOG等类型的字段不适合做索引。
孙子兵法有云,“不战而屈人之兵,善之善者也。故上兵伐谋,其次伐交,其次伐兵,其下攻城。”
当业务模型和数据模型等都已设计完成,数据库即将入数或已经开始对外提供服务时,SQL优化能力就可以大显身手,为数据库高效运行保驾护航了。
• Order by
• Group by
• Distinct
• Exists子查询
• Not Exists子查询
• In子查询
• Not In子查询
• Union(并集),Union All不会发生排序
• Minus(差集)
• Intersect(交集)
• Create Index
• Merge Join
• 减少使用不必要的ORDER BY排序
• 排序时,返回的列要尽量少
• 因为索引天然有序,所以尽量利用索引排序
• 避免使用耗费资源的操作,包括:DISTINCT,UNION,MINUS,INTERSECT,ORDER BY
• 使用group by代替distinct
• 对于范围查询,如果字段恰好是排序的,则查找和IO都会更快
• 表聚合的本质是做笛卡尔积
• 有小表时使用广播
• 驱动表选择小表,驱动表量越大越会引起性能问题(大小表前后问题)
• 使用 join 代替子查询。子查询需要在内存中创建临时表。
• 使用 join 代替子连接。子连接会先查外表再匹配内表。
• 需要join的字段最好创建索引,且是相同的数据类型
• 尽量使用union all而不是union(有去重操作)
• join 尽量不要超过 2 张表
• 用UNION替换OR ,用UNION-ALL 替换UNION
SELECT * FROM STUDENT, (SELECT * FROM SCORE) as sc;
• 出现在WHERE/ON等约束条件中或投影中的子句是子连接语句
SELECT * FROM STUDENT WHERE EXISTS ( SELECT A FROM SCORE WHERE SCORE.sno = STUDENT.sno);
其中STUDENT叫外表,SCORE称内表。
• 谓词下推,提前执行where谓词逻辑
• 用 in 替换 or
• 使用 between或exists 代替 in
• 用NOT EXISTS替代NOT IN
• 用Where子句替换HAVING子句
• 减少比较操作
on :与取得结果集同步进行数据刷选及过滤。
where : 获得结果集之后,才进行数据刷选及过滤。
执行顺序:on在上游,where在中游,having在下游。
left join 中on条件对左表无效,对右表有效;
right join中on条件对右表无效,对左表有效;
inner join时,结果与放在where条件中等价,但是on条件会先执行
以上为SQL优化的前置条件和优化技巧分享, 「分布式技术专题」是国产数据库hubble团队精心整编,专题会持续更新,欢迎大家保持关注。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69982626/viewspace-2756671/ ,如需转载,请注明出处,否则将追究法律责任。