mysql count 空表為何會很慢

2021-09-21 10:17:08 字數 2971 閱讀 2594

count(*)

乙個「空表」為什麼會很慢呢?只有幾十行資料為什麼

select *** from table limit 1

需要300ms

?select min(pk) fromtable

也會慢?

見下例:

dba@localhost : test 18:14:32> show create table test_hmw\g

*************************** 1. row ***************************

table: test_hmw

create table: create table `test_hmw` (

`mail` varchar(1024)default null,

`user_id` bigint(20)default null,

`id` int(10) unsigned notnull auto_increment,

primary key (`id`)

) engine=innodb auto_increment=3997636 default charset=utf8

1 row in set (0.00 sec)

dba@localhost : test 18:14:45> select count(*) from test_hmw;

+----------+

| count(*) |

+----------+

| 3813472 |

+----------+

1 row in set (0.69 sec)

dba@localhost : test 18:14:56> show status like '%last_query%';

+-----------------+---------------+

| variable_name |value |

+-----------------+---------------+

| last_query_cost |776677.599000|

+-----------------+---------------+

1 row in set (0.00 sec)

dba@localhost : test 18:15:14> delete from test_hmw;

query ok, 3813472 rows affected (15.11 sec)

dba@localhost : test 18:15:56> select count(*) fromtest_hmw;

+----------+

| count(*) |

+----------+

| 0 |

+----------+

1 row in set(0.31 sec)

dba@localhost : test 18:15:59> show status like '%last_query%';

+-----------------+---------------+

| variable_name |value |

+-----------------+---------------+

| last_query_cost |757879.799000|

+-----------------+---------------+

1 row in set (0.00 sec)

我們發現

count

乙個空表的

cost

和刪除前是一樣的(時間不一樣是因為快取);

其實在oracle

裡也存在這個現象,對於

select xx from table where rownum或者

select count(*)

之類的操作是從起始的

block

掃瞄到hmw

;而在mysql

裡不是hmw

,mysql

的多版本是直接儲存在表裡的,因此

mysql

在刪除了大量的資料,而

purge thread

**前進行上面的操作就會掃瞄大量的「空」

page

,因此也就有了這種現象;

既然知道原因在

mysql

可以通過重整表的方式再來看看

cost:

dba@localhost : test 18:16:01> optimize table test_hmw;

2 rows in set (1.85 sec)

dba@localhost : test 18:16:14> select count(*) fromtest_hmw;

+----------+

| count(*) |

+----------+

| 0 |

+----------+

1 row in set(0.00 sec)

dba@localhost : test 18:16:16> show status like '%last_query%';

+-----------------+----------+

| variable_name |value |

+-----------------+----------+

| last_query_cost |1.199000|

+-----------------+----------+

1 row in set (0.00 sec)

中斷為何會丟失

正在讀ulk3,第四章中斷中關於 do irq 的 中涉及中斷丟失的部分有點迷惑。如下 spin lock irq desc irq lock irq desc irq handler ack irq irq desc irq status irq replay irq waiting irq de...

人去床空,為何匆匆

系裡的提前畢業計畫完滿成功了,恭喜一下班主任,我們畢業了,告別了校園生活,此刻竟是如此的悵然。宿舍的人都不打算繼續留宿了,自然我也沒有留宿的必要,社長提醒我要找個時間回去收宿舍的東西,於是今天決定先進去把一些細小的給收回來。走在那熟悉的走廊上,卻有一種異樣的感覺,原來我們宿舍所屬的那一排宿舍已經全部...

mySQL count多個表的資料例項詳解

一 實現需求 最近在做成就係www.cppcns.com統,成就中有很多維度都和數量有關,比如使用者粉絲數達到多少50個,授予 名揚四海 稱號,使用者點讚達到 100 次,授予 點讚聖手 稱號等等。粉絲數在user relation表 點讚數在user praise表 按照以往的做法,如果需要查詢使...