mysql离散查询_如何写出高性能的MySQL查询

作者:会写代码的猪 发布时间:December 25, 2009 分类:猪在写代码

想写这样一篇文章很久了,但始终没有下手。最近帮同事看了几个查询,而且自己也在考虑一个索引系统的问题,所以今天就把这个写了。介绍一下MySQL的索引机制,还有一些MySQL查询的优化策略。鄙人才疏学浅,很可能说的不对,请路过的各位大侠批评指正,献丑了。

首先,说说MySQL的索引存储方式。MySQL的索引一般是B-Tree的结构存储的,内存表也有Hash索引,但是内存表的出镜率似乎已经低到了用“可怜”来形容的程度,所以我们只考虑B-Tree索引。

然后说说MySQL的联合索引。联合索引对于一个DBMS总是非常重要的,因为每一条SQL语句的条件子句是单条件的可能性很小,大多数情况下为组合条件,因此对于组合索引的依赖也就很强。MySQL对于联合索引的创建规则通过一个例子说明:

对于一个在列:col_a, col_b和col_c上的联合索引,MySQL会建立

index(col_a), index(col_a, col_b)和index(col_a, col_b, col_c)

这样三个索引。

介绍完一些基本原理,我们来看MySQL对于索引的选取规则和索引的建立原则(这些规则都是个人总结的,多来源于互联网,也有自己的经验)。

对于单个索引,一般来说MySQL的查询优化器总能在若干查询条件中选取效率较高的一个使用,所以不必投入太多精力,一般来说查询容易出现的问题容易出现在联合索引。这里以一个两列的索引为例,说明一些问题。

例如:

idx_a_b (col_a, col_b)

建立做和索引的列进行or组合不可使用索引

例如:有条件

col_a = val_a or col_b = val_b

这个条件,是不可以使用idx_a_b索引的。然而同样的查询对于却可以使用这样的索引idx_a(col_a)或者idx_b(col_b)的,因此在建立索引的时候就要考虑到出镜率最高的条件是什么,建立怎样的索引。而如果同时存在idx_a和idx_b两个索引的话,MySQL也只会选择一个使用,尽可能使用索引把结果集缩小,再在这个结果集中遍历,使用其他条件筛选。

联合索引对非前缀列不生效

例如:条件col_b = val_b这个条件是不会使用这个索引的,因为索引idx_a_b的前缀列是col_a。因此在建索引的时候,就要注意到,是否有很多使用这种条件的查询,需要为col_b单独建立索引。

对于组合索引,遇到范围查询则放弃使用剩余部分

例如:条件

col_a = val_a and col_b = val_b

是可以使用整个索引,而对于

col_a between val_a_left and val_a_right and col_b = val_b

这个条件,只会使用索引的col_a这一部分,不会使用整个索引。对于这样的查询,我们有一个优化策略,若col_a是一个离散变量,则建议使用in代替between,例如,

col_a between 1 and 5 and col_b = val_b

建议写成

col_a in (1, 2, 3, 4, 5) and col_b = val_b

这样是可以使用整个idx_a_b的。

现在能想到的对于组合索引的使用就这些,还远远不够全面,不过了解了这些原理,一般的查询都是可以分析的。接下来介绍几个策略性的SQL优化。

尽量少的选择列数

选择你需要的列,不用图省事就直接写个select *,一来是为了减少通信的开销,再有就是如果你所选的列,都建立索引,那么这次查询就不会对表数据进行任何操作,只查索引,就返回。

减少count(*), group by, distinct这样的操作

这三种操作将进行大量的计算,对数据库服务器造成很大压力,而且很慢。这样的查询能避免就避免,能缓存就缓存。

对于limit offset,若offset值较大,则采用分割结果集策略

limit offset操作一般用于翻页,当offset值较小的时候直接使用limit offset效率搞,但当offset值增大到一定程度,这个查询效率就会骤然降低。建议在大offset的情况下,采取这个策略:缓存上一次结果的尾数据,在新的查询中不使用offset,直接根据缓存结果进行查询。

例如:

select * from tb limit 100 offset 500000;

offset值很大,建议这样做:缓存上一次结果的主键值id=id_val,sql改写为:

select * from tb where id>id_val order by id limit 100

这条sql的效率将比上一条高很多倍。

策略性的优化也姑且先想到了这么几条,很不全面。综合上面的这些查询优化策略,我们还有几个提高性能的系统配置和管理策略。例如:

定期重建索引

一张表用的时间久了,数据频繁更新,索引碎片会很多,降低查询效率,重建索引可以整理这些碎片,大大提高查询和写入的效率。

配置恰当的query_buffer

如果你的机器有足够大的内存,那多分给MySQL一点吧,在一台8G内存的机器上,我们一般会分给MySQL 4到6个G,query的缓存会给你带来惊喜的。

选择恰当的引擎

常用的MySQL引擎有Innodb和MyISAM,前者更稳定且支持行级锁,后者处理一般查询效率更高。二者各有特点,一般我们会使用主从策略,主Innodb,从MyISAM的做法。

在恰当的时候分表或分库

MySQL很强大,但对于200到300万以上的数据进行处理,性能就开始有明显的下降了,因此一般到这个数量级,就建议拆分数据了。

别让查询链接阻塞

MySQL可以配置连接的超时时间,这个时间如果做得太长,甚至到了10min,那么很可能发生这种情况,3000个链接都被占满而且sleep在哪,新链接进不来,导致无法正常服务。因此这个配置尽量配置一个符合逻辑的值,60s或者120s等等。

当下能想到的也就是这些~~略显肤浅,不过就写到这里吧,希望可以抛砖引玉,给大家一个优化MySQL的建议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机中丢失msc,mscvr120.dll32位/64位版_修复计算机中丢失msvcr120.dll

mscvr120.dll32位/64位版_修复计算机中丢失msvcr120.dllmscvr120.dll是系统的非常重要的一个文件,相信很多的人都是遇到文件丢失的情况,这个时候就需要你在下载一个dll文件使用了!现在就为大家提供最新的dll文件下载,需要的可以看…

mysql解压缩版配置_MySQL 5.6 for Windows 解压缩版配置安装

1、MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的。如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\Program Files\MySQL\MySQL Server 5.6 该…

数据结构:顺序栈

文章目录栈:顺序栈的实现及操作:1.定义一个栈2.构造一个空栈3.取栈顶元素4.插入元素e5.删除栈顶元素,返回其值6.清空栈,销毁栈栈的操作实例及代码:栈: 从数据结构上来看,栈也是线性表&#xff…

计算机二级考试开考多久能出来,【计算机二级】明天就要开考了,你们准备好了吗?...

原标题:【计算机二级】明天就要开考了,你们准备好了吗?计算机二级考试马上要来了现在距离考试只有不到几个小时的时间了不知道各位同学准备的怎么样了呢?人有多大胆,复习拖多晚但这可不是什么好习惯奔赴“战场”之前先…

mysql面试题 高级_高级MySQL数据库面试问题 附答案

mysql -u USER_NAME -xml -e SELECT * FROM table_name > table_name.xml上面的例子中USER_NAME是数据库的用户名,table_name是待导出为xml文件的表名,table_name.xml是存放数据的xml文件9. MySQL_pconnect是什么? 它和MySQL_connect有什么区别?答&…

办公室中有一台计算机连接打印机,办公室就一个打印机,怎么让多个电脑一起用...

中小型企业的办公室一般只配一台打印机,每次打印东西都要把文件拷在U盘再转到连接打印机的那台电脑,很麻烦。那么怎么才能实现打印机多台电脑共享呢?以下把连接打印机的电脑成为“主电脑”,把需要的共享的电脑叫“客电脑”。1.设置…

数据结构:单链队列

文章目录队列:单链队列的实现及操作:1.定义一个队列2.构造一个空队列3.销毁队列4.插入元素e到队尾5.删除队头元素,用e返回其值单链队列操作实例及代码:队列: 队列是先进先出的线性表。 队列只允许在表的一端插入元素…

php修改mysql数据找不到_php 如何修改mysql数据

PHP MYSQL 修改删除数据创建userinfo_update.php,用于查询用户信息,先显示信息,在修改:先通过GET获取用户编号查询用户信息:$sql "select * from user_info where user_id".$_GET[userId]."";$re…

人工智能训练机器人的服务器,人工智能系统教会机器人如何在荒野中行走

对救援人员和户外运动爱好者来说,穿越荒野小径是一项有用的技能,但对机器人来说却很难。这并不是说这些机械动物没有能力在爬上山坡的同时避开倒下的树枝——最先进的机器学习算法可以做到这一点。问题在于它们缺乏通用性:人工智能驱动的机器…

(递归)猴子吃桃

题目&#xff1a; 猴子买一堆桃不知个数&#xff0c;每天吃桃子一半多一个&#xff0c;第n天只剩一个桃&#xff0c;问一开始买了几个桃。输入整数n(2<n<30)。输出买的桃的数量。 样例输入2&#xff0c;输出4。 样例输入3&#xff0c;输出10。 分析与解答&#xff1a; …

世界手机号码格式_脑炎康复之旅——世界脑炎日病友征文

○○脑炎康复之旅世界脑炎日病友征文2月22日是世界脑炎日(World Encephalitis Day)。2014年发起的世界脑炎日旨在致敬和鼓励全世界经历过脑炎的患者和脑炎医疗工作者。几年来&#xff0c;全球已有1.87亿人次参与世界脑炎日活动。2021年的世界脑炎日即将到来&#xff0c;今年世界…

pythoni手机版下载_Python进度栏和下载

已更新您的示例网址&#xff1a;我刚刚为此编写了一种超级简单的方法(将其略微修改)&#xff0c;以将pdfs刮出某个站点。 请注意&#xff0c;由于Powershell无法处理“ \ r”&#xff0c;因此只能在基于UNIX的系统(Linux&#xff0c;Mac OS)上正常运行import requestslink &qu…

(递归)斐波那契数列

题目 f1f21,fnafn−1bfn−2(n>2)f1f21,f_naf_{n-1}bf_{n-2}(n>2)f1f21,fn​afn−1​bfn−2​(n>2) 输入包含四个整数n(1≤n≤100),a(1≤a≤10),b(1≤a≤10),p((1≤a≤2000)。n(1\leq n \leq 100),a(1\leq a \leq 10),b(1\leq a \leq 10),p((1\leq a \leq 2000)。n(1≤…

树莓派和微信和服务器,用树莓派搭建微信公共平台

1、首先你需要一个公网ip&#xff0c; 需要做好映射&#xff0c; 把80端口映射到你的树莓派ip。2、打开你的树莓派终端&#xff0c; 创建文件夹“templates ” 和文件“weixind.py”。3、文件“weixind.py”中写入以下代码。安装“sudo apt-get install python-lxml”。5、申请…

mysql数据异常增长_mysql表到一定数据量后会异常的增长

如题InnoDB的table&#xff0c;里面的字段非常简单&#xff0c;如图中的类型才100多W的数据量&#xff0c;数据是慢慢积累起来的&#xff0c;到了最近发现涨到12G后&#xff0c;会每天成倍的增长&#xff0c;最高到达过50G&#xff0c;而数据量还是那些&#xff0c;longtext的字…

(递归)快速幂

题目 xyx^yxy当y很大&#xff0c;采用如下方式 {f(x,y2)f(x,y2),(y%20,y>0)1,y0f(x,y2)f(x,y2)x,(y%21,y>0)\left\{\begin{matrix} &amp; f(x,\frac{y}{2})\times f(x,\frac{y}{2}),(y\%20,y>0)\\ &amp; 1,y0\\ &amp; f(x,\frac{y}{2})\times f(x,\frac{y…

舰r4月28服务器维护,崩坏3 11月28日版本更新维护通知

亲爱的舰长&#xff1a;为了给舰长更好的游戏体验&#xff0c;休伯利安号将在11月28日进行版本更新维护&#xff0c;维护完成后战舰将更新为3.6版本——「绯夜霞隐」。维护时间安卓国服、iOS服和各渠道服&#xff1a;11月28日07:00~12:00全平台服(桌面服)&#xff1a;11月28日0…

ec200s 方案 移远_移远 4G Cat 1 无线通信模块EC200S

EC200S 是移远通信最近推出的LTE Cat 1 无线通信模块&#xff0c;支持最大下行速率10Mbps 和最大上行速率5Mbps&#xff0c;具有超高的性价比&#xff1b;同时在封装上兼容移远通信多网络制式LTE Standard EC2x(EC25、EC21、EC20 R2.0、EC20 R2.1)和EC200T/EG25-G/EG21-G 模块以…

(递归)弹簧板

题目 现在n个弹簧板&#xff0c;小球从第i个弹簧板落下&#xff0c;可以向前弹a[i-1]个距离或者b[i-1]个距离&#xff0c;现在从第一个弹簧板落下&#xff0c;计算弹多少次&#xff0c;弹出弹簧板。(1≤n≤200),(0<a[i],b[i]≤30)(1 \leq n \leq 200),(0 < a[i],b[i]\le…

maven 打包时缺少文件_maven父子工程---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到...

场景:因为之前用到的是,基于springboot框架所搭建的maven工程,而且都是相互独立的。现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B …)。Module A 以及Module B工程都…