当前位置: 首页 > 编程日记 > 正文

mysql处理上百万条的数据库如何优化语句来提高处理查询效率

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
[email=num=@num]num=@num[/email]
可以改为强制查询使用索引:
select id from t with(index(索引名)) where
[email=num=@num]num=@num[/email]
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.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

转载于:https://www.cnblogs.com/likeju/p/4689587.html

相关文章:

smarty mysql_Smarty处理mysql查询数组

Smarty处理mysql查询数组MySQL的查询结果一般是一个数组&#xff0c;而不是所有结果集。因此我们需要将结果全部存到数组中进行处理&#xff0c;然后就可以很轻松的再Smarty中使用了。PHP Mysql 代码$sql"select article_id,article_title from tbl_article order by arti…

Linux文件压缩与解压缩

什么是压缩文件&#xff1f;原理是什么?简单的说&#xff0c;就是经过压缩软件压缩文件叫压缩文件&#xff0c;压缩的原理是把文件的二进制代码压缩&#xff0c;把相邻的0,1代码减少&#xff0c;例如有000000&#xff0c;可以把它变成6个0的写法60来减少该文件的空间&#xff…

git 使用和一些错误

一、简单使用 Git是目前世界上最先进的分布式版本控制系统&#xff0c;用于自动记录每次文件的改动&#xff0c;但是和所有版本控制系统一样&#xff0c;只能跟踪文本文件的改动&#xff0c;比如TXT文件&#xff0c;网页&#xff0c;所有的程序代码等&#xff0c;而图片、视频这…

LTE Paging消息的接收

Paging消息的内容如下&#xff1a; 在idle和connected 下&#xff0c;UE可以分别接受如下信息&#xff1a; RRC 状态对应的Paging消息内容Idle1.系统消息改变 2. ETWS 3.呼叫请求Connected1.系统消息改变 2. ETWS 寻呼消息的设计初衷是&#xff1a; UE在idle态下&#xff…

android开发之Parcelable使用详解

想要在两个activity之间传递对象&#xff0c;那么这个对象必须序列化&#xff0c;android中序列化一个对象有两种方式&#xff0c;一种是实现Serializable接口&#xff0c;这个非常简单&#xff0c;只需要声明一下就可以了&#xff0c;不痛不痒。但是android中还有一种特有的序…

tomcat mysql 中文乱码_tomcat 中文乱码, mysql 中文乱码_MySQL

Tomcattomcat中文乱码 get 请求.修改server.xml中的添加URIEncodingUTF-8tomcat中文乱码 post 版另外HttpURLConnection上传参数的时候要转码成url编码 outStream.writeBytes("&" URLEncoder.encode(key, "utf-8") "" URLEncoder.encode(…

自己写的Python数据库连接类和sql语句拼接方法

这个工具类十分简单和简洁。 sql拼接方法 # encodingutf-8 from django.http import HttpResponse from anyjson import serialize from django.http import HttpResponse from anyjson import serialize import MySQLdbdef safe(s):return MySQLdb.escape_string(s)def get_i_…

Koa 本地搭建 HTTPS 环境

openssl 首先本地需要安装 openssl&#xff0c;用于生成自签名证书。 $ brew install openssl检查安装&#xff1a; $ openssl version LibreSSL 2.6.5生成证书 执行以下命令生成证书&#xff1a; openssl req -nodes -new -x509 -keyout server.key -out server.cert Generati…

eDRX中的Paging

在idle下&#xff0c;Legacy LTE的DRX周期最大值为2.56s, 频繁的唤醒会消耗UE的电量。为了降低功耗&#xff0c;延长待机时间&#xff0c;在Release 13&#xff0c;NB-IOT引入eDRX模式。eDRX就是Extended idle-mode DRX cycle,扩展不连续接受。 下面介绍超帧(Hyper-SFN)的概念…

ios 图片自动轮播

ios 图片自动轮播 #import "NYViewController.h"#define kImageCount 5interface NYViewController () <UIScrollViewDelegate> property (nonatomic, strong) UIScrollView *scrollView; property (nonatomic, strong) UIPageControl *pageControl;property (…

mysql练习题及答案_MySQL经典练习题及答案,常用SQL语句练习50题

#--插入学生表测试数据#(01 , 赵雷 , 1990-01-01 , 男)insert into Student values(01 , 赵雷 , 1990-01-01 , 男);insert into Student values(02 , 钱电 , 1990-12-21 , 男);insert into Student values(03 , 孙风 , 1990-05-20 , 男);insert into Student values(04 , 李云 …

一次因NAS存储故障引起的Linux系统恢复案例

推荐&#xff1a;10年技术力作&#xff1a;《高性能Linux服务器构建实战Ⅱ》全网发行&#xff0c;附试读章节和全书实例源码下载&#xff01;一、故障现象描述NAS操作系统内核为Linux&#xff0c;自带的存储有16块硬盘&#xff0c;总共分两组&#xff0c;每组做了RAID5&#xf…

手机网页H5 自适应不同分辨率的屏幕 必学标签meta之viewport

viewport 语法介绍 <meta name"viewport"content" height [pixel_value | device-height] , width [pixel_value | device-width ] , initial-scale float_value , minimum-scale float_value , maximum-scale float_value , user-scalable [yes | no]…

PSM-省电模式(PowerSaving Mode)

PSM: PowerSaving Mode, 省电模式, 是R12引入的新feature, spec可以参考&#xff1a;3GPP 24.301-5.3.11 Powersaving mode 和 23.682-4.5.4 UEPower Saving Mode.在PSM模式下&#xff0c;网络无法到达UE&#xff0c;UE无法接受来自于网络的数据和请求&#xff0c;类似于关机&…

mysql keepalived低版本_Mysql+keepalived主主切换

Mysqlkeepalived主主切换一&#xff0c;环境介绍网络结构&#xff1a;VIP :192.168.1.30MYSQL A:192.168.1.21MYSQL B:192.168.1.22二、mysql主主同步要实现mysqlkeepalived主主切换&#xff0c;首先要实现的就是两台mysql服务器的主主同步&#xff0c;查看http://smalldeng.bl…

Android环境搭建和Android HelloWorld—Android开发环境搭建

Android_Android开发环境搭建-搭建Android的开发环境 1.我考虑先下载JDK7.0,在JDK的安装中&#xff0c;考虑一般SDK都是向上兼容的&#xff0c;于是选择了最高的版本7.0这里是我总结的详细的JDK配置以及路径配置的过程&#xff1a; JavaSDK安装&#xff1a;安装JDK.exe然后配置…

30个在线学习设计与开发的站点

转&#xff1a;http://www.w3cschool.cc/w3cnote/30-best-websites-to-learn.html

【07月01日】A股滚动市净率PB历史新低排名

2010年01月01日 到 2019年07月01日 之间&#xff0c;滚动市净率历史新低排名。 上市三年以上的公司&#xff0c;2019年07月01日市净率在30以下的公司。 来源&#xff1a;A股滚动市净率(PB)历史新低排名。 1 - XD中国石(SH601857) - 历史新低 - PB_TTM&#xff1a;1.03 - PE_TTM…

LTE-连接态下的DRX

C-DRX: Connectedmode DRX,连接态下的DRX UE在连接态下&#xff0c;如果没有数据传输的话&#xff0c;会根据DRX的规则停止监听PDCCH(监听PDCCH可参考&#xff1a;PDCCH),从而达到省电的目的。一个DRX周期包含On Duration 和Opportunity for DRX 两个时间段。3GPP - 36.321中示…

mvc mvp mvvm的区别与联系_MVC,MVP,MVVM比较以及区别(上)

MVC&#xff0c;MVP&#xff0c;MVVM都是用来解决界面呈现和逻辑代码分离而出现的模式&#xff0c;以前只是对他们有部分的了解&#xff0c;没有深入的研究过&#xff0c;对于一些里边的概念和区别也是一知半解。现在一边查资料&#xff0c;并结合自己的理解&#xff0c;来谈一…

【性格心理学】为什么我在关键时刻总是紧张?

为什么我在关键时刻总是紧张&#xff1f; ~这是一种“对人恐惧症”&#xff0c;因为害怕失败~ 当在众人面前讲话时&#xff0c;或者公司会议中轮到自己发言时&#xff0c;有的人就会大汗淋漓、面红耳赤&#xff0c;甚至心跳不已&#xff0c;结结巴巴地连话都说不出来。在重大场…

iOS图片模糊效果

增加 CoreImage.framework CoreGraphic.framework 等库 在使用时引入&#xff1a;#import <Accelerate/Accelerate.h> &#xff0c;支持iOS 5.0 及以上。 -(void)show { UIImage* img [self getBlurImage:[UIImage imageNamed:"Default-568h.png"]]; [_bgIm…

YOLOv7-Pose 姿态估计-环境搭建和推理

终端,进入base环境,创建新环境,我这里创建的是p38t17(python3.8,pytorch1.7)安装pytorch:(网络环境比较差时,耗时会比较长)下载好后打开yolov7-pose源码包。imgpath:需要预测的图片的存放路径。modelpath:模型的存放路径。Yolov7-pose权重下载。打开工程后,进入设置。

分治——最近点对问题 hdu1007

问题描述 n个点在公共空间中&#xff0c;求出所有点对的欧几里得距离最小的点对。 解法1&#xff1a; 很明显的&#xff0c;暴力解决是$O(N^2)$ 解法2&#xff1a; 利用分治的思想&#xff0c;我们可以把算法优化到$O(nlogn*logn)$&#xff0c;甚至$O(nlogn)$ 我们先对所有的点…

NBIOT-NPSS/NSS/NPBCH的资源位置

1.NPSSNarrowbandPrimary Synchronization Signal时域位置每1个SFN存在一个NPSSSFNSubframeSymbol长度每个SFN5最后11个symbol11个symbols频域位置NB-IOT下行带宽固定180kHz&#xff0c;一个PRB&#xff0c;12个子载波。NPSS信号占用11个子载波2.NSSSNarrowbandSecondary Synch…

数组的排序与查找

/**对如下一个数组int[] iarr{34,67,1,56,32,78,12,45,79,4,57,102,123,3};进行排序(采用自己擅长的排序算法)&#xff0c;然后查询排序之后的采用二分查找*法查找45在在数组的索引值 &#xff0c;排序、查找封装成方法&#xff0c;然后在main方法中调用测试。*/ public class …

0基础学好python难不难_零基础学习Python难不难?Python有什么优势?

原标题&#xff1a;零基础学习Python难不难&#xff1f;Python有什么优势&#xff1f;Python是一种计算机程序设计语言。首先&#xff0c;我们普及一下编程语言的基础知识。用任何编程语言来开发程序&#xff0c;都是为了让计算机干活&#xff0c;比如下载一个MP3&#xff0c;编…

浅谈 MySQL 子查询及其优化

2019独角兽企业重金招聘Python工程师标准>>> 使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验&#xff0c;在子查询上都认为数据库已经做过优化&#xff0c;能够很好的选择驱动表执行&#xff0c;然后在把该经验移植到mysql数据库上&#xff0c;但是…

[PHP] JQuery+Layer实现添加删除自定义标签代码

JQueryLayer实现添加删除自定义标签代码 实现效果如下&#xff1a; 实现代码如下&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>实用的文章自定义标签</title> <link rel"stylesheet"…

NB-IOT: Anchor Carrier 锚点载波

Anchor Carrier定义&#xff1a; Anchor carrier:in NB-IoT, a carrier where the UE assumes that NPSS/NSSS/NPBCH/SIB-NB are transmitted. Anchor carrier用以发送NPSS/NSSS/NPBCH/SIB-NB&#xff0c; 另外寻呼消息和随机接入过程也只能在AnchorCarrier上进行。 在使用I…