如何避免写出“慢SQL”.docx
《如何避免写出“慢SQL”.docx》由会员分享,可在线阅读,更多相关《如何避免写出“慢SQL”.docx(5页珍藏版)》请在第壹文秘上搜索。
1、Ol定量认识MySQL这说明,慢SQL对数据库的影响,是一个从量变到质变的过程,对“量”的把握,对于开发人员来说是很重要的。一个合格的程序员,需要对数据库的能力有一个定量的认识。影响MySQL处理能力的因素有很多,比如,服务器的配置、数据库中数据量的大小、MySQL的一些参数配置、数据库的繁忙程度,等等。但是,通常情况下,这些因素对于MySQL的性能和处理能力的影响,大概在一个数量级的范围内,也就是上下几倍的性能差距。所以,我们不需要知道精确的性能数据,只要掌握一个大致的量级,就足够应对实际的开发工作了。目前,一台普通的MySQL数据库服务器,处理能力的极限大致是,每秒一万条左右的简单SQL。
2、这里的“简单SQL”,指的是类似于主键查询这种不需要遍历很多条记录的SQL语句。根据配置的高低,服务器的处理能力也会有所不同,可能低配的服务器只能达到每秒几千条,高配的服务器则可以达到每秒几万条,所以这里给出的每秒一万条是中位数的经验值。考虑到正常的系统不可能只有简单SQL,所以实际的处理能力还要打很大折扣。我个人的经验是,一台MySQL数据库服务器,平均每秒执行的SQL数量在几百左右,一般就已经是非常繁忙了。即使看起来CPU利用率和磁盘繁忙程度并不高,我们也需要考虑为数据库“减负”了。另外一个重要的定量指标是,多慢的SQL才算是慢SQL?这里的“慢”,衡量的单位本来是执行时长,但是对于时长这
3、个指标,我们在编写SQL的时候并不好衡量。因此可以用执行SQL查询时,需要遍历的数据行数来替代时间作为衡量标准,因为查询的执行时长与遍历的数据行数基本上是正相关的。我们在编写一条查询语句的时候,可以依据所要查询数据表的数据总量估算一下这条查询大致需要遍历多少行数据。如果遍历的行数在百万以内,只要不是每秒都要执行几十上百次的查询,就可以认为该查询是安全的。遍历数据行数达到几百万量级的,查询最快也要花费几秒的时间,这时我们就要仔细考虑有没有优化的办法。遍历行数达到千万量级或以上的,这种SQL就不应该出现在系统中了。当然,我们这里讨论的都是在线交易系统,离线分析类系统另当别论。遍历行数达到千万量级的
4、SQL,是MySQL查询的一个坎儿。在MySQL中,单个表的数据量,也要尽量控制在一千万条以下,最多不要超过两三千万这个量级。原因很简单,对一个千万量级的表执行查询,加上几个WHERE条件过滤一下,符合条件的数据最多可能是几十万或百万量级的,还是可以接受的。但如果再与其他的表做一个联合查询,遍历的数据量很可能就会超过千万量级了。所以,每个表的数据量最好控制在千万量级以内。如果数据库中的数据量本身就很多,而且查询业务逻辑确实需要遍历大量数据,应该怎么办呢?02使用索引避免全表扫描使用索引,可以有效减少执行查询时遍历数据的行数,从而提高查询的性能。数据库索引的原理比较简单,一个例子就能说明白。比如
5、,有一个无序的数组,数组中的每个元素都是一个用户对象。如果我们要把所有姓李的用户都找出来,那么比较笨的办法是,用一个循环把数组遍历一遍。是否还有更好的办法呢?答案是肯定的。比如,我们可以用一个MaP(在某些编程语言中是DiCtionary)来为数组做一个索引,Key用于保存姓氏,值是所有这个姓氏的用户对象在数组中序号的集合,如图1所示。这样在查找的时候,就不用遍历数组了,只需要先在MaP中查找,然后再根据序号直接去数组中获取用户数据即可,这样查找速度就快多了。数组下面我们把这个例子对应到数据库中,存放用户数据的数组就是表,我们构建的M叩就是索引。实际上,数据库索引的数据结构与编程语言中的MaP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 避免 写出 SQL
