记一次不好不坏的数据库优化

  最近项目当中有一项业务,需要循环操作上百张表,开始执行到结果返回耗时一分到一分半钟。

  偶然将数据库同步到另一台机器上,连接后发现执行时间不到十秒钟,十分疑惑。排除过网络以及机器配置原因,仍然不明白之前的数据库与同步过来的数据库之前有什么差异。

  通过StopWatch监测代码的执行情况,并使用log4net将结果输出到文件中。经过记录分析后发现,部分表的查询耗时较长,原因是表中数据量过万,一时之间也没有太好的办法。

  通过搜索数据库优化方法,得到一些简单建议,中心思想就是避免全表扫描。比如对分组或者条件筛选列建立索引,不要对列使用计算表达式(如:where num / 2 > 1,应该写成 num > 2)等。对sql语句进行分析后,做了如下优化:

  1. 调整了条件语句中相关条件的顺序;
  2. 将数字列的判断放在前面,字符列的判断放在后面;
  3. 针对分组或者条件筛选列建立索引。

  最终的效果是,当筛选条件范围较小时,语句执行速度较快,基本五秒之内就会返回结果;当筛选条件范围略大一些时,执行速度几乎与优化之前没有太大区别。所以猜测,索引建立的不合适,或者,索引并非导致查询过慢的瓶颈。

后来使用了Sql Server 自身的Profier,参见下图:

记得勾选保存到文件或者保存到表,并通过事件选择Tab页设置好相关事件。开始运行后就可以监测到sql 语句的执行情况了。

  在Profier的监测过程中,执行了之前的循环多表查询。等执行完成后,点击红色的四方按钮,停止监测,见下图:

  接着打开数据库引擎优化顾问,浏览Sql Server Profier跟踪生成的文件或表,选择用于工作负荷分析的数据库以及需要优化的数据库:

  等待分析完成以后,查看分析报告,挑选出耗时较长的操作,并参考优化建议。

  跟踪文件分析完成后,其中有部分表的查询耗时较长,优化顾问给出的建议是将多列组合以后建立索引,而不像之前分别针对分组或者条件筛选列独立建立索引。

  通过参考优化顾问建立索引的方式,对数据库部分表建立索引之后,当筛选条件范围较小时,语句执行速度较快,基本五秒之内就会返回结果;当筛选条件范围略大一些时,执行速度基本保持在十秒之内;当筛选条件范围更大一些时,执行速度基本保持在二十至三十秒之间。优化带来的效果比较明显,但与通过同步过来未经过优化的数据库相比,时间的消耗还是较大。经过向别人询问后,知道通过同步过来的数据库与原数据库逻辑上是一样的(即数据库结构是一样的),但物理结构(即文件组织结构)不同。通过对数据库执行(预)收缩操作,发现原数据库数据以及日志可用空间不足5%,同步过来的数据库数据以及日志可用空间20%---40%。初步猜测原数据库可用空间不足也是导致查询过慢的一个原因。由于不了解如何人为增大数据库可用空间(一般都是通过数据库的自增长增加可用空间),并没有从此方面实施优化。

  当然,数据库目前还有优化的空间,只是,了解的还是不够深入,只能先优化到这个地步。欢迎园友一起讨论。

时间: 2024-10-21 13:52:18

记一次不好不坏的数据库优化的相关文章

mysql优化-数据库优化、SQL优化

我有一张表w1000,里面有1000万条数据,这张表结构如下:CREATE TABLE `w1000` ( `id` varchar(36) NOT NULL, `name` varchar(10) DEFAULT NULL, `age` int(3) DEFAULT NULL, `money` double(8,2) DEFAULT NULL, `address` varchar(100) DEFAULT NULL, `create_date` datetime(3) DEFAULT NULL

数据库优化 - SQL优化

前面一篇文章从实例的角度进行数据库优化,通过配置一些参数让数据库性能达到最优.但是一些"不好"的SQL也会导致数据库查询变慢,影响业务流程.本文从SQL角度进行数据库优化,提升SQL运行效率. 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长 应用的日志出现超时等错误 可以使用sar命令,top命令查看当前系统状态. 也可以通过Prometheus.Grafana等监控工具观察系统状态.(感兴趣的可以翻看我之

MySQL数据库优化、设计与高级应用

MySQL数据库优化主要涉及两个方面,一方面是对SQL语句优化,另一方面是对数据库服务器和数据库配置的优化. 数据库优化 SQL语句优化 为了更好的看到SQL语句执行效率的差异,建议创建几个结构复杂的数据表,多导入一些数据进行测试,看到的效果比较直观. 尽量避免在列上进行运算,这样会导致索引失效. 优化前SELECT * FROM t WHERE YEAR(d)>=2011; 优化后SELECT * FROM t WHERE d>='2011-01-01'; 使用JOIN时,应该用小结果集驱动

数据库优化

本文介绍一点,关于数据库优化方面的经验总结,希望对需要的人有所帮助! 优化请掌握以下几点(高手请补充): 1.表上的字段不要太多,能独立出去的尽量独立出去,虽然表上的字段多,写代码会比较方便, 但是运行效率就差了 2.将字符串的比较变成数字型比较每个系统都会有用户管理,其中必然有 昵称,密码,邮件等的字符串类型数据比较的问题.在数 据库操作中,字符串比较的效率是相当低下的.因此遇到字符串的比较,必须将其转换为数字型 比较.  具体做法是:在数据库表中增加相应的数字字段,比如 cNickname

单机数据库优化的一些实践(mysql)

数据库优化有很多可以讲,按照支撑的数据量来分可以分为两个阶段:单机数据库和分库分表,前者一般可以支撑500W或者10G以内的数据,超过这个值则需要考虑分库分表.另外,一般大企业面试往往会从单机数据库问起,一步一步问到分库分表,中间会穿插很多数据库优化的问题.本文试图描述单机数据库优化的一些实践,数据库基于mysql,如有不合理的地方,欢迎指正. 1.表结构优化 在开始做一个应用的时候,数据库的表结构设计往往会影响应用后期的性能,特别是用户量上来了以后的性能.因此,表结构优化是一个很重要的步骤.

MySQL数据库存储引擎与数据库优化

存储引擎 (1)MySQL可以将数据以不同的技术存储在文件(内存)中,这种技术就成为存储引擎. 每种存数引擎使用不同的存储机制.索引技巧.锁定水平,最终提供广泛且不同的功能. (2)使用不同的存储引擎也可以说不同类型的表 (3)MySQL支持的存储引擎 MyISAM InnoDB Memory CSV Archive 查看数据表的创建语句: SHOW CREATE TABLE 表名 相关概念: (1).并发控制:一个人读数据,另外一个人在删除这个数据. 当多个连接对记录进行修改时保证数据的一致性

[mysql][【优化集合】mysql数据库优化集合

三个层面: 1.系统层面 2.mysql配置参数 3.sql语句优化 =========================================================== 一.系统层面 =========================================================== 二.mysql参数层面 http://www.oicto.com/mysql-explain-show/ 2.1slowlog 配置slowlog 配置文件: log-slow

数据库优化处理

数据库的优化程度影响了一个程序的执行力和用户的体验感,所以数据库的优化显得格外重要. 一.框架 根据业务需求选择合适的开发框架,不近对数据库的优化有帮助,而且对于程序后期的维护也很有帮助,根据项目的需求,看项目需要满足多少人的访问量,并发量到多少.不是说小公司就不需要分布式.大数据这些,考虑长期的问题. 将一些固定不常变化的值,设置为常量:采用缓存机制,减少对于数据库的访问(连接池):服务器的优化(队列): 二.数据库本身 1.表结构的设计 表的设计来源于需求,同时表的建立也会影响需求的实现,一

数据库优化概览

数据库优化,一直是很让人头疼的事,尤其对于当前互联网发展到了一定的时期,数据量达到了一定的数量级,处理数据比较慢,这方面的知识就显得尤为重要了.这里就大概来说下数据库优化的相关知识. 先说下当前数据库大部分都还是以关系型数据库为主流,但是现在NoSQL也慢慢变得越来越重要了,毕竟现在是大数据时代,但是这里主要是讲关系型数据库. 数据优化是①找出系统瓶颈:②合理结构设计和参数调整,提高响应速度:③节省系统资源.其原则是①减少系统瓶颈:②减少资源占用:③增加系统反应速度.一般包括优化查询和优化数据库