mysql 概率查询,MySQL查询优化

认真写文章,用心做分享。

公众号:xy的技术圈

为什么查询会慢?

查询慢的原因可能很多,比如网络原因、锁争用等等。但最基本的原因可能是访问的数据太多。要么可能访问了太多的行,要么可能访问了太多的列,要么可能MySQL在查询的时候需要分析大量超过需要的行。

查询优化

一个查询根据不同的场景,一般可以通过下面的方式来进行优化:

使用COUNT *

在使用COUNT统计行数时,COUNT(*)是性能最高的。

使用LIMIT

有时候查询并不需要返回所有的结果集,这时候可以加LIMIT限制返回多少。这在分页的场景下很常见。

MySQL在进行UNION操作的时候,如果把LIMIT写在外查询里,会先将两个子查询的所有数据放在临时表,然后取前xx行。这样性能其实是比较低的,更推荐的做法是把LIMIT同时也到子查询里。

有时候可以使用LIMIT 1来代替MIN和MAX函数。因为这两个函数需要全表扫描。

不要查询所有列

有时候为了方便,会直接写SELECT *来查询所有列的数据。但可能使用的时候不一定要使用到所有列。这个时候可以只查询部分需要用到的列。

但有时候可能也有例外,因为这样做确实可以简化开发,而且有时候应用程序里面可能会有缓存机制,这样多个查询可能可以复用这个缓存。

经常查询的列建立索引

在前面的文章《MySQL索引原理》及《MySQL索引使用策略和优化》中,我们介绍了MySQL的索引。在经常查询的列上面建立索引,可以让MySQL尽可能地扫描少的行。

但这里也需要注意,维护索引是有代价的,所以需要自己去权衡时候使用索引。还有一点就是MySQL的索引是基于“最左匹配”原则的。详情可以参考之前的文章。

分解复杂查询

有时候一个复杂查询可能会“很大”,需要扫描许多行,关联很多表。这个时候可以把它分解成很多个小的查询。这样做有很多好处:

让缓存的效率更高

执行单个查询可以减少锁的竞争

更容易对数据库进行拆分

减少冗余记录的查询:有时候关联查询可能会重复查询同样的数据行。

当然,分解后也会带来弊端,就是发生的查询数量多了,MySQL的连接数就多了,可能会带来网络上的一些开销。但MySQL一般是放在内网的,网络一般会很快,所以不会有太大的影响。

反范式设计数据表

在设计数据表的时候,为了性能上的优化,可以反范式地设计表。这样可以减小表的关联,加快查询的速度。

使用IN

MySQL在查询的时候使用IN()时,会先将IN列表中的数据进行排序,然后通过二分查找的方式来确定列表中的值时候满足条件,这是一个O(log n)复杂度的操作,而如果是OR的话,复杂度是O(n),所以如果对IN列表中有大量取值的时候,使用IN会更快一些。

但尽量不要使用IN加子查询。因为MySQL会将相关的外层表压到子查询中,效率很低。如果是需要用到IN加子查询的时候,建议使用EXISTS()等效查询来做。

不使用OFFSET

OFFSET在分页的时候很常见。一旦页码过大,OFFSET和导致MySQL扫描大量不需要的行然后丢掉。那如何解决这个问题呢?有两种方式。

第一种方式是从前端就限制了用户不能直接访问太大的页码。比如百度搜索结果下面的分页,限制了用户很难访问到很大的页码。

第二种方式是使用主键来辅助。比如上一页返回的id的1000,那下一页就可以直接WHERE查找id大于1000且小于1020。这样查的时候就可以不用OFFSET了,MySQL也只需要扫描很少的行。但这样有一个弊端,就是有些数据可能被删掉了,那每页的范围和数量就不太好控制。

总结

总的来说,主要是针对MySQL本身的查询流程和引擎实现来做优化。但实际我们开发程序的时候,在应用层可以做缓存来优化性能,这样可以大大减少MySQL的请求和查询次数。

另一方面,MySQL的索引非常重要,理解索引的原理,创建合适的索引可以极大地提升查询的性能。使用索引的主要好处就是可以在查询的时候扫描更少的行。

更多文章,关注公众号:xy的技术圈

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL数据库的执行过程可以分为以下几个步骤。 首先,客户端发起查询请求,连接到MySQL的客户端。在此过程中,可能需要进行权限校验以确保用户有权限进行相应的操作。 接下来,查询优化器根据SQL语句所涉及的表、索引、行数等信息计算出执行SQL所需的成本值,并选择一个最优方案作为执行计划。MySQL采用基于成本的查询优化器(CBO),它会根据查询的复杂度和数据量选择最优的执行策略。通过注释语法,我们还可以控制优化器的行为以作出最符合当前情况的选择。 然后,MySQL根据执行计划执行查询操作。这时候已经获得了一棵比较规范的查询树。MySQL会根据查询条件和索引等信息进行数据查找和筛选,并返回满足条件的结果集。如果查询缓存开启且命中缓存,则直接返回缓存中的数据。但是命中缓存的概率较低,因此默认情况下查询缓存是关闭的。 最后,MySQL查询结果返回给客户端,并完成整个查询过程。在查询的过程中,MySQL还可以通过自动备份来保护数据的安全性和可恢复性。通过设置定期执行的任务或脚本,可以自动备份MySQL数据库的数据和结构。这样可以在意外情况下恢复数据或保护数据免受损失。 综上所述,MySQL数据库的执行过程包括客户端连接、查询优化器选择最优执行计划、执行查询操作并返回结果集,以及可选的自动备份过程。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值