mysql查询优化

之前在面试的时候,被问过MySQL查询相关的问题,做PHP也有两年多了,发现对于查询优化这方面,还不是特别清楚,所以就在网上查询相关的文档,在一篇博客中深受启发,要想了解MySQL的查询优化,就需要了解MySQL的查询机制,也就是他的查询都经过了什么哪些步骤。在网上盗了一张图:


1.客户端发送一条查询给服务器

2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果,否则进入下一阶段。

3.服务器进行SQL解析,预处理,再由优化器生成对应的执行计划,

4.mysql根据优化器生成的执行计划,调用存储引擎的API来执行查询。

5.将结果返回给客户端。


不知道大家在平常的数据库查询中有没有发现一个问题,就是用navicat(我用的是这个数据库管理软件)执行sql的时候,执行同样的语句时,第2次的时间时间远比第一次的时间短(可能在一个小的数据库中不是很明显),那是因为,第二次的时候数据库只执行到上面的第二部就已经将结果返回给客户端了,所以时间会很短,这只是一个很简单,很常见的现象,但是也是从上面的图中可以反应出的一个结果。


还有就是当查询一个量级较小的数据库是,一个复杂的查询语句会比多个简单的查询语句效率高,但当如果是一个量级比较大的数据库的时候,多个简单的查询语句会比一个复杂的语句查询效果高(这里先不考虑存储过程),如果数据量大的话,把查询结果放到内存的时候会耗费很长时间,等待表锁的时间也会很长,数据量小的话,就存在类似的问题了,反而多次查询造成的连续开关数据库会耗费很长的时间,总之是两者之害取其轻。但是如果使用存储过程的话,就会优化很多。其实我自己感觉这和分流类似。当然这些都是在内存和服务器大小等外部条件固定的情况下来讲的。

一些简单的重构查询的方式:

  1.一个复杂查询 or 多个简单查询

    设计查询的时候一个需要考虑的重要问题是,是否需要将一个复杂的查询分成多个简单的查询。

  2.切分查询

    有时候对于一个大查询我们需要“分而治之”,将大查询切分为小查询,每个查询功能完全一样,只完成一小部分,每次

    只返回一小部分查询结果。

  3.分解关联查询

    select * from tag 

       join tag_post on tag_post.tag_id = tag.id

       join post on tag_post.post_id = post.id

    where tag.tag = 'mysql'

    可以分解成下面这些查询来代替:

    > select * from tag where tag = 'mysql'

    > select * from tag_post where tag_id = 1234

    > select * from post where post_id in (123, 456, 567, 9098, 8904)    

  优势:

      让缓存的效率更高。

      将查询分解后,执行单个查询可以减少锁的竞争。

      在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。

      查询本身效率也可能会有所提升。

      可以减少冗余记录的查询,

      更进一步,这样做相当于在应用中实现了哈希关联,而不是使用mysql的嵌套循环关联。

总之,了解了MySQL的查询机制,对于以后的深度查询优化很有帮助,其实这篇博客也是我参照另外一篇博客并加了一部分自己的感受,毕竟对于MySQL深度的理解我也不是很到位,大家共同学习嘛。最后推荐一位博主,他的一一些关于MySQL查询性能优化方面的文章写的挺好的,大家可以去看看。(http://www.cnblogs.com/w2154/p/4691015.html),关于查询性能优化方面的有6篇,也有很多关于MySQL方面的知识,在此分享给大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gy__My

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值