mysql高水位线问题

数据库水位线的概念大家应该都有所了解,以前我个人觉得这个基本上是纯理论的,跟我们实际开发写sql好像没什么关系。但是在解决一次慢sql的过程中遇到了水位线的问题。

问题现象:

功能出现慢查。慢查sql为    DELETE    FROM tb_cust_search_task_detail    WHERE task_id = 2024;

问题分析:

大家看了这个sql估计第一反应都是数据量太大了所以导致了慢查,而且会员检索确实存在数据量很大的问题。所以第一个冒出来的解决方案就是分批删除

然后我就看了下大概多少数据量能导致这样的慢查

一个任务下才3万多个明细就能导致删除超过5分钟??当时有点怀疑,不过我还是没有细究,还是按照分批删除敲代码了。

敲完代码当然就是要测试下速度, 在sqladmin里查发现SELECT * FROM tb_cust_search_task_detail    WHERE task_id = 2024    LIMIT 10000 居然查不出来,超过30秒了。。。。。

EXPLAIN看下

扫描行数居然近亿了,总量不是才3万多么,也用到索引了,为什么rows值还是这么大??? 然后看了比这个数量多的其他task_id的执行计划都是正常的。。

然后我就各种百度了下,越看越觉得可能高水位线的问题。看了下面的背景大家应该都知道为什么了

(这里说下这个task_id的背景,这个task_id是个周期性任务,每个半小时就会重新检索一遍,然后把之前的全部delete掉,再insert。这样就是做很频繁的delete,insert)

那后面就是要解决怎么降低这个水位线的问题,如果解决不了,就是改成分批删除一样还是慢查。找了DBA一起讨论这个问题,dba给的建议就是让我加个单独的task_id索引,理由单独的索引更好查询更快(可惜后面mysql没有选用这个索引),顺便他做下表重组,降低高水位线。

重组之后的执行计划,就很正常了

问题的解决方案:

1. 提交脚本给dba,让dba进行表重组,解决目前高水位线的问题

2. 针对于周期性的检索任务,不再采用先全部delete,再insert。不然后面还是有高水位线的问题。 新的方式是 :重新检索的数据跟老的对比,该insert的insert,该delete的delete

3. 针对于页面功能重新检索,编辑的地方,需要删除检索明细的(这种删除次数不是很多的)。改成分批删除

如果很频繁的做delete和insert的时候,可能就要考虑下会不会也存在这种隐患问题。

时间: 2024-10-07 02:32:37

mysql高水位线问题的相关文章

一、oracle 高水位线详解

一.什么是水线(High Water Mark)? 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM.这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment.HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位

通过段调优顾问回收大表的分配空间和高水位线

--通过段调优顾问回收大表的分配空间和高水位线 --创建用户 SQL> create tablespace hzqtbs datafile '/u01/app/oracle/oradata/prod/hzqtbs.dbf' size 30m; Tablespace created. SQL> create user hzq identified by hzq default tablespace hzqtbs quota unlimited on hzqtbs account unlock;

高水位线引起的查询变慢解决方法

众所周知,随着不断地进行表记录的DML操作,会不断提高表的高水位线(HWM),DELETE操作之后虽然表的数据删除了,但是并没有降低表的高水位,除非你使用TRUNCATE操作,进行表查询的时候,Oracle会扫表高水位以下的数据块,也就是说,扫描的时间并不会有所减少.所以DELETE删除数据以后并不会提高表的查询效率. 下面通过这个例子,用来解决高水位引起的查询变慢问题: --例子中测试表占用表空间大小为:128M SQL> SELECT a.bytes/1024/1024 || 'M' FRO

oracle 高水位线详解

一.什么是水线(High Water Mark)? 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM.这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment.HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位

Oracle释放高水位线

/*****************************************************************原因:由于原导出数据库没有整理表空间其中主要包括两方面,一是用户产生太多的DELETE,致使表的高位线(HWM)在很高的位置,所以尽管数据量很小,但是占据的表空间很大,二是索引没有重建,频繁的删除以及更新使得索引越来越大,REBUILD索引是个很必要的事情********************************************************

oracle 高水位线

在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的 水.水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM).在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值.当插入了数据以后,高水位线就会上涨,但是这 里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位.也就是 说,这条高水位

高水位线

一.什么是水线(High Water Mark)? 所有的Oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM.这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment.HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位

Oracle数据库入门——高水位线详解

一.什么是水线(High Water Mark)? 所有的oracle段(segments,在此,为了理解方便,建议把segment作为表的一个同义词) 都有一个在段内容纳数据的上限,我们把这个上限称为"high water mark"或HWM.这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment.HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位

Oracle清除表的高水位线

在新增记录时,HWM会慢慢往上移,但是在删除记录后,HWM却不会往下移.所以在使用delete from命令删除大量数据时会导致因HWM引起的性能问题. 删除高水位的最直接的方法就是truncate Table 但是这种方式太过暴力,所以用以下的方法来删除高水位线. --删除数据 DELETE FROM GJDS_BUS_OIL_LOG WHERE VERSION < (13112-100); --压缩快 move最好是在空闲时做  记得move的是会产生TM锁的  move以后记得重建inde