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表 按照以往的做法,如果需要查詢使...