当今各行业信息量呈现爆炸式增长,因此,数据库优化也就显得弥足重要。随着数据库性能问题的出现,每位用户为了解决出现的问题,不得不满网上到处搜索优化的”灵丹妙药“和捷径,于是,就出现了各种各样的条条框框和金科玉律,以至于这些观点流传很广,对广大用户的影响也很大,例如:

1、SQL语句必须怎么写和注意什么才能性能好,某种写法会比其他写法性能好。这种说法,虽然不能说完全是错的,但也不能说是对的。我们看看数据库优化器的演化和发展历程,就能明白这么说的原因。低版本的数据库优化器是基于规则(rule)的,所谓基于规则,就是SQL语句的执行计划是和SQL的语法息息相关的,也就是说,SQL语句的写法决定了最终的执行计划,也就决定了该SQL语句的性能状况。随着优化器的不断进化和发展,目前所有关系库的优化器都是CBO,也就是基于成本的优化器,顾名思义,在这种优化器中,SQL语句的执行计划和写法几乎没什么关系,而是根据优化器计算出的成本来选择出最好的执行计划的,哪个执行计划成本最低,那么就用哪个执行计划,因此,性能也最好。不可否认,最先进的关系库优化器,例如:Oracle12c,虽然智能化程度已经非常高,机制和算法已经非常先进和完善,产生的执行计划也不可能100%的是最高效的,其中的因素很多,这里不意义论述。甚至在某些场景下,SQL语句的写法确实会影响最终的执行计划,从而影响SQL语句的性能好坏。

2、我经常听到现场的用户惊呼:不好了,数据库中有锁。针对这种情况,我曾经一遍遍的和他们讲,关系库中存在锁是很正常的,在一个高负载、高并发的关系库中,时时刻刻都会存在一些、甚至大量的锁,这是关系库的核心机制,在这种高负载、高并发的数据库上,有锁是正常的,没有锁是不正常的,所以,数据库中存在锁也就不值得奇怪和吃惊了。存在锁没什么奇怪的,关键是看看是否正常,那么,怎么看锁是否正常,针对每种关系库,都有自己一套理论和办法来查询和分析,这里不再赘述。

3、很多用户对SQL调优(SQL TUNING)情有独钟,不管遇到什么数据库的问题,都会想到SQL调优上去。确实,SQL调优确实可以在很大程度上改善数据库的性能,改善幅度也可能是最大的,但在对SQL进行调优前,要看看其他层面或方面是否正常,在确定了性能问题确实是因为SQL引起的,在进行SQL调优,也许才会起到有的放矢,从而起到最好的优化作用。除了SQL层面,还有很多层面和方面会影响数据库性能,例如:OS层面的性能也会影响到数据库性能,因为它是数据库的平台和容器;同时,如果数据库系统存在问题,单纯去进行SQL 调优,可能也是解决不了问题的。OS和DB层面存在问题,导致数据库性能问题的案例在现实中还是经常会遇到的。所以,在SQL调优前,固定其他层面和方面的因素是必须的。

4、数据库存在性能问题,经常听到很多人立刻问道:数据量多大?如果听说上亿或者更大,马上就说:这么大数据量,性能当然会有问题,于是乎那些问问题的人马上就会心服口服。其实这里面会有错误的认识,数据量大是导致出现性能问题的基础,如果数据库里没数据,也就不会出现性能问题,但即使有几十亿,上百亿,上千亿数据量,我只取其中的一条或很少部分数据,且计划正确,也未必就会存在性能问题。也经常有人说,我们上百亿数据量,或PB级数据量,能做到毫秒级的速度,这明显是内行人忽悠外行人,或者外行人忽悠外行人,能不能到毫秒级,和多方面因素有关,还有关键看怎么用数据,有些需求,几百万甚至更少就能出现严重的性能问题,而有的需求,几百亿上千亿,性能也不是问题,但现实中,偏偏很多人被这种说法给说服了,而且心悦诚服的虔诚样子,每次我对这些类似说法提出质疑,从来没得到过正面回应。所以,数据量是性能问题的诱因,但非必然。两本书,一本有几十页,另一本有几千页,通过目录去查找某一章节,速度也许不会真的有数量级的差别,但因为目录大小不同,性能也许会有点差别,一个道理。

以上仅仅举出了现实中最常见的几种情况和误解,其他类似的情况或案例也许会很多,这里不再一一赘述。

所谓优化,不是条条框框,也不存在金科玉律,而是基于深厚理论基础,进行丰富实践的理解和总结,理论和实践缺一不可。其实,现实中很多行业都是一样的,优化从来不是一个入门级的技术,它是一种熟能生巧,活学活用的技能,因此,对于一个初学者来说,应该打好基础,不断实践,在实践中不断总结,积累到一定程度,就能解决一些性能方面的问题,不可否认,优化也有一定的技巧和规律可循,但需要基础才能领会和掌握。

基于个人理解,希望能对大家有所帮助。

再谈数据库优化(database tuning)的真谛和误区的更多相关文章

  1. poptest老李谈数据库优化总结

    poptest老李谈数据库优化总结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088 ...

  2. 霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_206 举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种"指南"和" ...

  3. 浅谈数据库优化方案--表和SQL

    1.数据类型的选择 1.字段最好设置为非空.若字段为char(8),即便是NULL也会现有8个字符的空间. 2.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能, ...

  4. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

  5. sqlserver数据库脱机时发生异常:由于无法在数据库 'SMS' 上放置锁,ALTER DATABASE 失败。请稍后再试。 ALTER DATABASE 语句失败。 (.Net SqlClient Data Provider)

    sqlserver数据库脱机时发生异常,如下: =================================== 设置脱机 对于 数据库“SMS”失败.  (Microsoft.SqlServe ...

  6. MySql学习(五) —— 数据库优化理论篇(一)

    一.数据库管理系统 数据库管理系统(Database Management System, DBMS) 衡量是否是数据库的标准: ACID:是指在数据库管理系统(DBMS)中事务所具有的四个特性: 1 ...

  7. 再谈Transaction——MySQL事务处理分析

    MySQL 事务基础概念/Definition of Transaction 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个 sql 语句,这些语句要么都执行 ...

  8. 浅谈SQL优化入门:3、利用索引

    0.写在前面的话 关于索引的内容本来是想写的,大概收集了下资料,发现并没有想象中的简单,又不想总结了,纠结了一下,决定就大概写点浅显的,好吧,就是懒,先挖个浅坑,以后再挖深一点.最基本的使用很简单,直 ...

  9. MySQL/Oracle数据库优化总结

    MySQL数据库优化的八种方式 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能 ...

随机推荐

  1. Mysql 查看定时器 打开定时器 设置定时器时间

    1.查看是否开启evevt与开启evevt. 1.1.MySQL evevt功能默认是关闭的,可以使用下面的语句来看evevt的状态,如果是OFF或者0,表示是关闭的. show VARIABLES ...

  2. 导入dmp文件时,需要删除原有ORACLE数据库实例

    导入dmp文件时,对于已存在的数据库实例及表处理方式:删除实例. 1.以管理员身份登录 sqlplus / as sysdba 2.停止实例 shutdown abort; 执行结果:ORACLE i ...

  3. @Value注解分类解析

    1.1.1            @Value注解 @Value的作用是通过注解将常量.配置文件中的值.其他bean的属性值注入到变量中,作为变量的初始值. (1)常量注入 @Value(" ...

  4. AtCoder Beginner Contest 113 D Number of Amidakuji

    Number of Amidakuji 思路:dp dp[i][j]表示经过(i, j) 这个点的方案数 然后一层一层地转移, 对于某一层, 用二进制枚举这一层的连接情况, 判断连接是否符合题意, 然 ...

  5. Python3 操作Excel

    首先说明一下 在处理大文件时,openpyxl 的性能不如 xlrd,xlwt等.所以可以读取的时候使用xlrd,写的时候用openpyxl. 今天遇到一个使用场景:excel存放的是一条条用例,包含 ...

  6. UCS2编码

    UCS2就是标准的unicode编码, 它是某国际组织设计的一种文字符号编码表,包括了世界上绝大多数文字和符号,包括中文,每个字符使用2字节编码,因此叫ucs2. 这里有一篇文章对Unicode编码做 ...

  7. Axure 元件焦点的控制

    讲解如何控制光标的位置,主要学习了以下三种场景: 1.点击邮箱或者密码时,光标分别自动定位到email.password的文本框处: 2.还有将密码对应的文本框的内容设置为密码的格式(····) 3. ...

  8. (转+整理)C#中动态执行代码

    通过微软提供的CSharpCodeProvider,CompilerParameters,CompilerResults等类,可以在运行时,动态执行自己写的代码文件.原理就是把你的代码文件动态编译成e ...

  9. Python学习笔记之参数解析

    python提供了两种方法进行命令行的参数解析,分别是getopt和optparse类中的模块OptionParser,下面分别详细了解这两个模块: 1.getopt模块 首先复习C语言的命令行解析: ...

  10. spring cloud: Hystrix(四):feign类似于hystrix的断容器功能:fallback

    spring cloud: Hystrix(四):feign使用hystrix @FeignClient支持回退的概念:fallback方法,这里有点类似于:@HystrixCommand(fallb ...