1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
5.in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
6.下面的查询也将导致全表扫描:
select id from t where name like '%abc%'
若要提高效率,可以考虑全文检索。
7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30'生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
12.不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(...)
13.很多时候用 exists 代替 in 是一个好的选择:
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)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
15.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
16.应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。
17.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
18.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
19.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
20.尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。
21.避免频繁创建和删除临时表,以减少系统表资源的消耗。
22.临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。
23.在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。
24.如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。
25.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
26.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。
27.与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。
28.在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
29.尽量避免大事务操作,提高系统并发能力。
30.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
数据库查询性能需注意几点经验
四种数据库随机获取10条数据的方法
SQL Server:SELECT TOP 10 * FROM T_USER ORDER BY NEWID()ORACLE:SELECT * FROM (SELECT * FROM T_USER ORDER BY DBMS_RANDOM.RANDOM()) WHERE RONUM <= 10MySQL:SELECT *
Mysql分页查询limit语句的性能分析
一、limit用法在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能。SELECT * FROM table LIMIT [off
sql文件导入[ERR] 2006 - MySQL server has gone away
目录 问题 原因 解决办法 如何设置和查看使用Navicat Premium 12导入mysql的sql文件时,导入失败,出现如下错误:2006 - MySQL server has gone away。mysql出现ERROR : (2006, &
mysql8.0 .ibd文件恢复表结构的实现
今天早上启动了 phpstudy 软件中的 MySQL 8.0 数据库时,发现它启动后约过了 3 秒就自行关闭了。接着又自动启动然后再次关闭,似乎陷入了一个“开-闭-开”的循环。这导致我无
MySQL实现按分秒统计数据量方式
目录
1. 每秒交易量
2. 每分钟交易量
3. 每5分钟交易量
4. 每10分钟交易量
5. 每30分钟交易量
结合 WHERE
Redis的五种基本类型和业务场景和使用方式
目录 Redis是什么? Redis的特点 依赖 配置 redis的配置类(用于格式转换,处理乱码) String(字符串) 特点 业务场景 代码使用案例 List(列表) 特点 业务场景 代码使用案例 S
Oracle中BLOB、CLOB的读取和写入方式
目录 Oracle中BLOB、CLOB的读取和写入 基于SQL的方式实现CLOB、BLOB的插入与读取 1. 插入大类型数据 2. 读取大类型数据并转换为字符串 基于Java方式实现CLOB和B
dbeaver如何导出mysql数据库
目录 dbeaver导出mysql数据库 右键表-tools-Dump database 按默认设置 总结 dbeaver导出mysql数据库右键表-tools-Dump database按默认设置只需修改输出文件夹我这里把
DBeaver如何实现导入excel中的大量数据
目录 DBeaver如何导入excel中的大量数据 步骤一:将Excel文件转换为CSV格式 步骤二:在DBeaver中创建数据库表(如果尚未创建) 步骤三:导入CSV文件到数据库表 注意事项 总结
Oracle归档日志爆满问题的处理方法
目录 一、先清理归档日志使得数据库能够正常连接 二、排查问题 三、处理问题 四、清理后效果最近客户单位的oracle数据库出了问题,经常出现无法连接,报错提示 ORA-00257: arc
Mysql中常用函数之分组,连接查询功能实现
目录 函数 单行函数 字符函数 数学函数 日期函数 流程控制函数 分组函数 分组查询 按单个字段分组 在分组前进行条件筛选 在分组之后进行条件筛选 按多字段分
SQL Server计算两个时间相差的示例代码
目录 1、计算两个时间字符串之间的差值 2、字符串转换成日期/时间类型 3、计算两个日期和时间之间的差值在 SQL Server 中,计算两个时间字符串之间的差值 首先将这些字符串转
Oracle DECODE 丢失时间精度的原因与解决方案
目录 问题描述 原因分析 解决方案在Oracle数据库中,DECODE 函数是一个非常实用的条件处理函数,通常用于替代简单的 CASE WHEN 语句。它根据给定的值列表进行匹配,如果匹配成功
使用 SQL 快速删除数百万行数据的实践记录
目录 描述 实践描述删除表大批量数据,这是一个比较少的事件。 但在实际的业务开发中或者数据测试也会遇到这种情况。比如定期从日志大表中删除几百万的数据记录;删除表数据的
MySQL处理大量DELETE操作的多种方法
目录 前言 简介 概述 DELETE 操作的基本概念 常用的 DELETE 方法 核心源码解读 简单 DELETE 语句 批量 DELETE 示例 案例分析 案例1:使用简单 DELETE 删除用户数据
MySQL删除表数据、清空表命令详解(truncate、drop、delete区别)
目录 一、MySQL清空表数据三种方法 1.1 清空表数据:truncate 1.2 删除表:drop 1.3 删除/清空表数据:delete 二、使用原则 三、truncate、drop、delete区别 1.操作类型
mysql如何将数据库中的所有表结构和数据导入到另一个库
目录 一、问题描述 二、解决方案 1.使用mysqldump命令备份数据库 2.创建目标数据库 3.导入数据 到目标数据库 三、补充知识 3.1 mysqldump命令介绍 3.2 常用备份命
MySQL深分页,limit 100000,10优化方式
目录 一、limit深分页为什么会变慢 二、优化方案 2.1 通过子查询优化(覆盖索引) 回顾B+树结构 覆盖索引 把条件转移到主键索引树 2.2 INNER JOIN 延迟关联
MySQL中的TRUNCATE()函数用法
目录 MySQL的TRUNCATE()函数 规则如下 函数示例 当 X 为正数时 当 X 为负数时 总结 MySQL的TRUNCATE()函数TRUNCATE(X,D) 是MySQL自带的一个系统函数。其中,X是数值,D
查看本地MYSQL数据库IP地址的三种方法
目录 方法一:在电脑设置中查看电脑iP地址 方法二:通过运行程序查看电脑IP地址 方法三:通过浏览器查看电脑IP地址 拓展:在自己电脑建立了MYSQL数据库,但是想在其它的电脑进行连接,
Redis中pipeline(管道)的实现示例
目录 概念 Pipeline 底层原理分析 Redis单个命令执行基本步骤 RTT 时间 Redis Pipeline Pipeline实际应用场景 数据导入导出 数据处理 批量操作 其他应用场
Postgresql开启SQL执行语句收集过程
修改配置文件1.打开Postgresql配置文件,如:C:\Program Files\PostgreSQL\14\data\postgresql.conf
2.修改如下,如果字段被#注释,则去掉#log_directory = 'log'
log_file
MySQL分区表的使用
目录 创建分区 删除分区 分区性能 总结说明:分区表,顾名思义,就是一张表根据规则,划分多个区,通过分区,实现一种“逻辑隔离”,这在Saas系统中是非常常见的。本文介绍如何
KubeSphere部署mysql的详细步骤
目录 1.创建mysql基础配置 2.创建pvc挂载 3.创建工作负载 4.创建服务(创建服务后才能进行外部访问) 5.测试mysql是否能正常访问演示示例使用的是3.4.1,各版本有名字差异 功能是
mySQL 8.0.33安装指南(推荐)
目录 安装步骤 1. 解压安装包 2. 移动解压后的文件夹 3. 创建MySQL用户 4. 设置权限 5. 配置MySQL 6. 设置环境变量 7. 初始化数据库 8. 设置系统服务 9. 设置roo
重置MySQL 8.0 Root密码的简便方法小结
目录 解决方案 1. 检查是否输入正确的密码 2. 使用“跳过权限表”的方式重置 root 密码 2.1 停止 MySQL 服务 2.2 以跳过权限表模式启动 MySQL 2.3 重
Redis实现接口防抖的示例代码
目录 实现 演示说明:实际开发中,我们在前端页面上点击了一个按钮,访问了一个接口,这时因为网络波动或者其他原因,页面上没有反应,用户可能会在短时间内再次点击一次或者用户以为没
Solusi MySQL 错误无法启动
发生的错误好吧,当我在 laragon 应用程序中从mysql 5.1.72升级到mysql 8.0.32时,发生了这个错误。当我在 laragon 应用程序中 start all 时,出现的错误是这样的。laragon 中的
掌握数据库操作:索引、视图、备份和恢复
介绍在本实验中,我们将学习和练习索引、视图、备份和恢复。这些概念对于数据库管理员来说非常重要。学习目标 创建索引 创建视图 备份与恢复准备开始之前,我们需要准备好环境
怎么导入mysql数据库文件 mysql数据库怎么导入sql文件
如何将 SQL 文件导入 MySQL 数据库导入 MySQL 数据库文件的方法:使用 MySQL 客户端 打开 MySQL 客户端并连接到目标数据库。 使用 SOURCE 命令,后跟要导入的 SQL 文件路径:SOUR