mysql查询时间段_MySQL性能优化之影响性能的因素转载于:martin
mysql语句转oracle
既然要优化数据库,我们就⾸先要知道,优化的是什么,或者说:什么因素影响了数据库的性能。
影响数据库因素主要因素总结如下:
1. 商业需求对性能的影响*
java语言程序设计第十章2. 系统架构(存储架构)及实现对性能的影响*
3. query语句对数据库性能的影响*
4. Schema设计对系统性能影响*
5. 硬件环境对数据库的性能的影响*
商业需求对性能的影响
不合理需求造成资源投⼊产出⽐过低,这⾥我们就⽤⼀个看上去很简单的功能来分析。
需求:⼀个论坛帖⼦总量的统计
附加要求:实时更新
从功能上来看⾮常容易实现,执⾏⼀条 SELECT COUNT(*) from 表名的 Query 就可以得到结果。但是,如果我们采⽤不是 MyISAM 存储引擎,⽽是使⽤的 Innodb 的存储引擎,那么⼤家可以试想⼀下,如果存放帖⼦的表中已经有上千万的帖⼦的时候,执⾏这条 Query 语句需要多少成本?恐怕再好的硬件设备,都不可能在 10 秒之内完成⼀次查询吧。
注:没有 where 的 count(* ) 使⽤ MyISAM 要⽐ InnoDB 快得多。因为 MyISAM 内置了⼀个计数器,count(* ) 时它直接从计数器中读,⽽ InnoDB 必须扫描全表。所以在 InnoDB 上执⾏ count(*) 时⼀般要伴随 where,且 where 中要包含主键以外的索引列。
既然这样查询不⾏,那我们是不是该专门为这个功能建⼀个表,就只有⼀个字段,⼀条记录,就存放这个统计量,每次有新的帖⼦产⽣的时候,都将这个值增加 1,这样我们每次都只需要查询这个表就可以得到结果了,这个效率肯定能够满⾜要求了。
java编程需要哪些软件确实,查询效率肯定能够满⾜要求,可是如果帖⼦产⽣很快,在⾼峰时期可能每秒就有⼏⼗甚⾄上百个帖⼦新增操作的时候,恐怕这个统计表⼜要成为⼤家的噩梦了。要么因为并发的问题造成统计结果的不准确,要么因为锁资源争⽤严重造成整体性能的⼤幅度下降。
switch语句里代码有什么限制吗
其实这⾥问题的焦点不应该是实现这个功能的技术细节,⽽是在于这个功能的附加要求“实时更新”上⾯。当⼀个论坛的帖⼦数量很⼤了之后,到底有多少⼈会关注这个统计数据是否是实时变化的?有多少⼈在乎这个数据在短时间内的不精确性?恐怕不会有⼈会盯着这个统计数字并追究当⾃⼰发了⼀个帖⼦然后回头刷新页⾯发现这个统计数字没有加 1 吧?所以只要去掉了这个“实时更新”的附加条件,就可以⾮常容易的实现这个功能了。就像之前所提到的那样,通过创建⼀个统计表,然后通过⼀个定时任务每隔⼀定时间段去更新⼀次⾥⾯的统计值,这样既可以解决统计值查询的效率问题,⼜可以保证不影响新发贴的效率,⼀举两得。
系统架构(存储架构)及实现对性能的影响
access数据库在哪里所有数据都是适合在数据库中存放的吗?数据库为我们提供了太多的功能,反⽽让很多并不是太了解数据库的⼈,错误的使⽤数据库中很多并不太擅长、或对性能影响很⼤的功能,最后却全部怪罪到数据库⾝上。
vb中selecteditem⽐如有些数据需要考虑是否存储在MySQL
1. 流⽔队列数据
2. ⼆进制多媒体数据
3. 超⼤的⽂本数据
4. 其它⽤户上传的⽂件、图⽚等资源
是否考虑了缓存
对于 Web 系统或者 APP 应⽤,是否有⼤量热读数据及⽆需及时变更的数据,然⽽这些数据可以考虑缓存起来,提⾼ MySQL 的性能及节
约 DB 资源。⽐如笔者公司的优惠券列表、⼴告列表、配置规则信息等,属于⽤户附表信息,⽆需频繁更新,可以利⽤ Redis 缓存,让应
⽤跑得更快,⽤户体验更好。
query 语句对数据库性能的影响
开发⼈员不能只关注查询结果不关注查询过程,⽐如每个⽤户查询各⾃相册列表(假设每个列显⽰ 10 张相⽚),能够在相⽚后有留⾔,我们
要查看留⾔的数量。
实现的话有好⼏种⽅案。
⽅案1:
select id,subject,url from photo where user_id=? limit 10
通过第⼀步的结果循环10次执⾏
select count(*) from photo_comment where photo_id=?
⽅案2:
第⼀步和上⾯是⼀样的,第⼆步通过程序拼装上⾯得到的 10 个 photo_id,通过 in 查询,
select photo_id,count(*) from photo_comment where photo_id in(?)group by photo_id"
⼀次得到 10 个 photo_id 所有的回复数量。
简要分析的话,⽅案2更简单⼀些。
也可以根据 explain 执⾏分析,具体看执⾏计划和性能损耗情况(cpu、io 的损耗情况)
mysql>set profiling=1;mysql>select id,subject,url from photo where user_id=? limit 10;mysql>select photo_id,count(*) from photo_comment where photo_id in(?)g
如上系列操作,是分析 SQL 语句的执⾏计划和性能损耗情况。
Schema 设计对系统性能影响
论坛帖⼦案例:假设现在是⾼并发的⼀个论坛系统。
你需要考虑⾼并发的论坛最⾼的并发在哪⾥?可能最⾼的并发是查看帖⼦标题列表,现在往往帖⼦标题后⾯会跟⼀个作者的昵称。 然⽽根
据需求帖⼦标题(作者昵称),这⾥需要关联(这⾥就需要有⼀个 join 查询),但是由于⾼并发业务尽量避免使⽤关联查询, 尽量⾛单表查询,
那此时就会在帖⼦表冗余作者的昵称,违反了范式设计,但是却提⾼了系统性能和 QPS。
关于 Schema 设计⼤多秉承的基础是基于范式设计,然⽽真实系统中其实个⼈总结有如下建⽴:
1. 短⼩、精简(字段选型、表列数、char(N)、varchar(N) 等)
2. 字段冗余
3. ⼤⼩字段拆分(text、varchar(255) 等)
4. 单表⾏数拆分
最终的⽬的就是:表⼩、⾏⼩、字段⼩
硬件环境对数据库的性能的影响
数据库是存取数据的地⽅,所以数据库主机的 IO 性能肯定是需要最优先考虑的⼀个因素,这⼀点不管是什么类型的数据库应⽤都是适⽤的。在主机中决定 IO 性能部件主要由磁盘和内存所决定,当然也包括各种与 IO 相关的板卡。
如何去选择具体的硬件,⼀般要基于业务是 OLTP 还是 OLAP,这样你才能选择适合的数据库或对应的存储引擎。
OLTP系统:⼀般并发量⼤,整体数据量多,每次访问数据较少,访问数据⽐较离散, 有活跃数据并且⽐例不⼤。庞⼤的内存活跃数据可以 Cache,访问频繁每次访问数据少,那么对磁盘的 IOPS 表现要好,吞吐量是次要的。并发⾼,CPU 要求⾼,⽹络交互频繁⽹络设备要求较⾼。
OLAP系统:⼀般数据统计类,⼤多选⽤商业数据库,不过基于 Oracle 的⼤多费⽤昂贵,MySQL 也确实提供的 Inforbright 列式存储的存储引擎,其此类业务具有数据量⼤,并发访问不多,每次访问需要检索的数据都⽐较多,访问集中,没有明显的活跃数据的特点,需要尽可能⼤的磁盘吞吐量,并发不多,CPU 要求不⾼。
总之:要根据⾃⼰系统的特性选择更适合更廉价的硬件设备。
总结
只有了解哪些因素会影响数据库的性能,才能结合业务去逐个优化和提升对应的性能,不管是存储层⾯、硬件层⾯、数据层⾯等。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。