首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL慢查询基础:优化数据访问

查询性能底下最基本的原因是访问的数据太多。某些查询可能不可避免的需要筛选大量数据,但这并不常见。大部分性能底下的查询都可以通过减少访问的数据量的方式进行优化。对于低效的查询,我们大学通过下面两个步骤分析总是很有效:

1、确认应用程序是否在检索大量超过需要的数据。这通常意味着访问太多的行,但是有时候也可能是访问了太多的列。

2、确认MySQL服务器层是否在分析大量超过需要的数据行。

(一)是否向数据库请求了不需要的数据

有些查询会请求超过实际需要的数据,然后这些多余的数据会被应用程序丢弃。这会给MySQL服务器带来额外的负担,并增加网络开销,另外也会消耗应用服务器的CPU和内存资源。

这里有一些典型的案例:

(1)查询不需要的记录

一个常见的错误就是常常会误会以为MySQL会只返回需要的数据,实际上MySQL却是先返回全部结果集在进行计算。我们经常会看到一些了解其他数据库系统的人会涉及出这类应用程序。这些开发者习惯使用这样的技术,先使用SELECT语句查询大量的结果,然后获取前面N行后关闭结果集(例如在新闻网站取出100条记录,但是只是在页面上显示前10条)。他们认为MySQL会执行查询,并只返回他们需要的10条数据,然后停止查询。实际情况是MySQL会查询出全部的结果集,客户端的应用程序会接收全部的结果集数据,然后抛弃其中大部分数据。最简单有效的解决方法就是在这样的查询后面加上LIMIT。

(二)多表关联时返回全部列

如果你想查询所有在电影xxxx中出现的演员,千万不要按下面的写法编写查询:

这将返回这三个表的全部数据列。正确的方式应该是像下面这样智取需要的列:

(三)总是取出全部的列

每次看到SELECT * 的时候都需要用怀疑的眼光审视,是不是真的需要返回全部的列?很可能不是需要的。取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O、内存和CPU的消耗。因此,一些DBA是严格禁止SELCET * 的写法语句,这样做有时候还能避免某些列被修改带来的问题。

当然,查询返回超过需要的数据也不总是坏事。这种有点浪费数据库资源的方式可以简化开发,因为能提高相同代码片段的复用性,如果清楚这样做的性能影响,那么这种做法也是值得考虑的。如果应用程序使用了某种缓存机制,或者有其他考虑,获取超过需要的数据也可能有其好处,但不要忘记这样做的代价是什么。获取并缓存所有的列查询,相比多个独立的只获取部分列的查询可能就更有好处。

(四)重复查询相同的数据

如果你不太小心,很容易出现这样的错误----不断的重复执行相同的查询,然后每次都返回完全相同的数据。例如,在用户评论的地方需要查询用户头像的URL,那么用户多次评论的时候,可能就会反复查询这个数据。比较好的方案是,当初次查询的时候将这个数据缓存起来,需要的时候从缓存中取出,这样性能显然会更好。

IT开发前线

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180404G1WBCW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券