Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SQL调优思路

SQL调优思路

原创
作者头像
一个风轻云淡
发布于 2024-06-26 16:42:16
发布于 2024-06-26 16:42:16
2020
举报

前言

SQL调优是数据库管理和开发中的关键环节,它涉及到对数据库查询语句的精细调整,以及整个数据库结构的优化。这个过程并不仅仅局限于编写高效的查询语句,而是涉及到数据库的整个生命周期,包括表的设计、索引的创建、以及更高级的架构设计,如主从复制和读写分离策略。在处理大量数据时,还可能涉及到分库分表等技术来提升性能。

SQL调优的目的是多方面的,不仅包括提升查询的响应速度,还包括减少服务器的资源消耗,提高系统的稳定性和可靠性。这通常涉及到对查询计划的分析,以找出可能导致性能瓶颈的环节,并进行相应的优化措施。

表设计优化

在数据库设计中,遵循合理的范式原则是至关重要的。这意味着我们需要根据业务规则和数据特性来设计表结构,以消除数据冗余和维护数据一致性,从而提升数据存储的效率和质量。然而,在某些情况下,为了提高查询效率,我们可能会采取适当的反范式策略,比如将某些经常一起查询的字段冗余存储在同一个表中,以减少表之间的连接操作。

选择正确的数据类型对于优化数据库性能同样重要。对于数值类型的字段,我们应该根据数值的范围来选择最合适的整数类型,例如使用TINYINT来存储小范围的整数,如布尔值或状态码;使用INT来存储常规大小的整数,如用户ID或计数器;使用BIGINT来存储大范围的整数,如大型计数器或ID。对于字符串类型的字段,我们应该根据字符串的特性和长度来选择数据类型,例如使用CHAR来存储固定长度的字符串,如国家代码或性别标识;使用VARCHAR来存储可变长度的字符串,如个人姓名或地址;使用TEXT来存储较长的文本内容,如文章或评论。

索引优化

索引是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。

通俗来说, 索引就相当于一本书的目录, 可以根据页码快速查找到指定的内容, 目的就是加快数据库的查询速度,但这也就意味着书中如果要增加一个章节,修改目录是比较麻烦的,使用索引适用于经常查询很少修改的业务

在 MySQL 中,通常有以下两种方式访问数据库表的行数据:

1) 顺序访问

  • 顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。
  • 顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。

2) 索引访问

  • 索引访问是通过遍历索引来直接访问表中记录行的方式。
  • 使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。
  • 注意: 建立索引后, 查询速度不一定会变快,例如, 你在teacher表中建立了关于id的索引, 如果你按照name查询, 那么查询速度也不会变快,查询得用到你建立的索引

sql语句优化

  1. 避免开头模糊查询:如LIKE ‘%value’,这种查询会导致数据库无法使用索引,因为它必须检查每个字符。
  2. 减少IN和NOT IN的使用:虽然IN运算符在某些情况下可以使用索引,但如果列表过长或与NULL值一起使用,它可能会导致性能下降。
  3. 谨慎使用OR:当使用OR连接多个条件时,如果每个条件都不能有效利用索引,那么可能会导致全表扫描。
  4. 避免NULL值判断:查询中的NULL值判断(如IS NULL或IS NOT NULL)通常会导致索引失效,因为索引不存储NULL值。
  5. 避免在WHERE子句中使用函数和表达式:对索引列使用函数或表达式(如WHERE UPPER(column) = ‘VALUE’)会阻止索引的使用。
  6. 避免使用不等于运算符:如<>或!=,这些运算符通常会导致索引失效。
  7. 避免隐式类型转换:在比较不同类型的数据时,数据库可能会进行隐式类型转换,这会导致索引不被使用。
  8. **避免使用SELECT ***:只选择需要的列,可以减少不必要的数据传输和处理。
  9. 避免使用通配符选择所有列:在SELECT语句中使用通配符可能会检索不需要的数据,增加I/O消耗。
  10. 优化多表关联查询:在JOIN操作中,将小表放在前面,大表放在后面,可以减少总的扫描行数。
  11. 使用UNION ALL代替UNION:UNION ALL不会去重,但它比UNION更快,因为UNION需要额外的一步来去除重复行。

MySQL通过创建并填充临时表的方式来执行union查询。除非确实要消除重复的行,否则建议使用union all。原因在于如果没有all这个关键词,MySQL会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性校验,这样做的消耗相当高。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode - 按奇偶排序数组②
这题是LeetCode第N次周赛的题目,题号是922,难度是Easy,当时处于疯狂刷通过率高的题目,然后提高自己的信心的地步...看提交记录,应该是一个月三周前提交的了。
晓痴
2019/07/24
1.4K0
LeetCode - 按奇偶排序数组②
leetCode180|按奇偶排序数组II
对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。
码农王同学
2021/02/02
2890
LeetCode 922. 按奇偶排序数组 II(双指针)
对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。
Michael阿明
2020/07/13
3010
LeetCode 922. 按奇偶排序数组 II(双指针)
按奇偶排序数组II
力扣题目链接:https://leetcode-cn.com/problems/sort-array-by-parity-ii/
代码随想录
2021/10/19
1.1K0
【一天一大 lee】按奇偶排序数组 II (难度:简单) - Day20201112
对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。
前端小书童
2020/11/19
4460
【一天一大 lee】按奇偶排序数组 II (难度:简单) - Day20201112
按奇偶排序数组II
给定一个非负整数数组A,A中一半整数是奇数,一半整数是偶数。 对数组进行排序,以便当A[i]为奇数时,i也是奇数;当A[i]为偶数时,i也是偶数。 你可以返回任何满足上述条件的数组作为答案。
WindRunnerMax
2020/11/13
1.2K0
[LeetCode] 922. Sort Array By Parity II 按奇偶排序数组之二
Given an array A of non-negative integers, half of the integers in A are odd, and half of the integers are even.
lucifer210
2019/11/14
5840
数组排序问题-LeetCode 905、922、1122、451(哈希表,双指针)
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。 你可以返回满足此条件的任何数组作为答案。
算法工程师之路
2019/11/26
7140
JavaScript数据结构与算法-Sort
这个方法需要 (n + 1 + n + 1) = 2n + 2 次运算。 我们把 算法需要执行的运算次数 用 输入大小n 的函数 表示,即 T(n) 。
FinGet
2019/06/28
7360
JavaScript数据结构与算法-Sort
LeetCode 1630. 等差子数组
如果一个数列由至少两个元素组成,且每两个连续元素之间的差值都相同,那么这个序列就是 等差数列 。更正式地,数列 s 是等差数列,只需要满足:对于每个有效的 i , s[i+1] - s[i] == s[1] - s[0] 都成立。
freesan44
2021/12/06
2320
LeetCode 905. 按奇偶排序数组
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
freesan44
2020/06/11
5120
LeetCode 989. 数组形式的整数加法
https://leetcode-cn.com/problems/add-to-array-form-of-integer/
freesan44
2021/09/11
4290
LeetCode 989. 数组形式的整数加法
LeetCode 1630. 等差子数组
如果一个数列由至少两个元素组成,且每两个连续元素之间的差值都相同,那么这个序列就是 等差数列 。更正式地,数列 s 是等差数列,只需要满足:对于每个有效的 i , si+1 - si == s1 - s0 都成立。
freesan44
2021/09/06
2760
LeetCode 1630. 等差子数组
LeetCode - 按奇偶排序数组
LeetCode第905题,难度简单。这题很容易联想到之前发过的LeetCode - 按奇偶排序数组②
晓痴
2019/08/01
1.4K0
LeetCode - 按奇偶排序数组
脚撕LeetCode(922)Easy
题目地址:https://leetcode-cn.com/problems/sort-array-by-parity-ii/
JathonKatu
2022/01/18
1250
LeetCode 992. K 个不同整数的子数组(双指针)
给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定独立的子数组为好子数组。
Michael阿明
2021/09/07
6590
LeetCode 算法题
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
用户9615083
2022/12/25
3320
LeetCode 算法题
LeetCode 1636. 按照频率将数组升序排序
给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。
freesan44
2021/12/06
4420
LeetCode算法题 顶
第1题https://leetcode-cn.com/problems/two-sum/
算法之名
2020/03/19
3090
用javascript分类刷leetcode19.数组(图文视频讲解)5
数组操作的时间复杂度Access:O(1)Search:O(n)Insert: 平均O(n),最好的情况下O(1),也就是在数组尾部插入O(1),最坏的情况下O(n)Delete;平均O(n),最好的情况下O(1),也就是在数组尾部删除O(1),最坏的情况下O(n)图片167. 两数之和 II - 输入有序数组 (easy)给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers
hellocoder2028
2023/01/09
5320
相关推荐
LeetCode - 按奇偶排序数组②
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档