MySQL切分查询用法分析

本文实例讲述了MySQL切分查询用法。分享给大家供大家参考,具体如下:

很多时候基于php+MySQL建立的网站所出现的系统性能瓶颈往往是出在MySQL上,而MySQL中用的最多的语句就是查询语句,因此,针对MySQL数据库查询语句的优化就显得至关重要!本文就此问题做出详细分析如下:

对于大查询有时需要‘分而治之’,将大查询切分为小查询:
每个查询功能完全一样,但只完成原来的一小部分,每次查询只返回一小部分结果集。

1、判断是否向MySQL数据库请求了不需要的数据,如下列情况:

删除旧的数据就是一个很好地例子。定期清理旧数据时,如果一条sql涉及了大量的数据时,可能会一次性锁住多个表或行,耗费了大量的系统资源,却阻塞了其他很多小的但重要的查询。将一个大得DELETE语句切分为较小的查询时,可以尽量减少影响msql的性能,同时减少mysql复制造成的延迟。

、查询不需要的数据,例如你需要10条数据,但是你选出了100条数据加了limit做限制。、多表关联时返回全部列、总是取出全部列select*……取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还为服务器带来额外的I/O、内存、和cpu的消耗、重复查询相同的数据例如,在用户评论的地方需要查询用户的头像的URL,那么用户多次评论的时候将这个数据缓存起来,需要的时候从缓存取出,这样性能会更好。

例如,每个月会运行一次的语句,以清理三个月前的数据:复制代码 代码如下:mysql DELETE FROM messages
WHERE dtDATE_SUB(NOW(), INTERVAL 3 MONTH);

2、mysql是否在扫描额外的记录

可以用以下的方法来完成这样的任务:

最简单衡量查询开销的三个指标如下:响应时间、扫描的行数、返回的行数

rows_affected = 0do { rows_affected = do_query("DELETE FROM messages WHERE dtDATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000")}while rows_affected0

响应时间:服务时间和排队时间。服务时间是指数据库处理这个查询真正花费的时间。排队时间是指服务器因为等待某些资源而没有真正执行的查询。

一次删除一万行数据是个比较高效且对服务器影响较小的做法。同时如果每次删除数据时暂停一会,可以将服务器原本的一次性压力分散到一个较长的时间段中,从而减少删除时锁表锁行的时间。

扫描的行数返回的行数:理想情况下扫描的行数和返回的行数应该是相同的。

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

一般MYSQL能够使用如下三种方式应用where条件记录,从好到坏依次为:

希望本文所述对大家MySQL数据库计有所帮助。

、在索引中使用where条件来过滤不匹配的记录,在存储索引层完成。

、使用索引覆盖扫描来返回记录,直接从索引中过滤不需要的记录并返回命中的结果,在mysql服务器层完成,但无需在回表查询记录。

、从数据表中返回数据,然后过滤不满足条件的记录,在mysql服务器层完成,需要先从数据表读出记录然后过滤

如果发现查询需要扫描大量的数据但返回少数的行,那么通常可以尝试下面的技巧:

、使用索引覆盖扫描,把所有需要的列都放到索引中,这样存储引擎无须返回表获取对应行就可以返回结果了。

、改变库表结构,使用单独的汇总表。