MySQL中1萬條資料查詢花費35秒,求解釋?

時間 2021-06-27 05:35:44

1樓:聿明leslie

你這條query為什麼會慢呢?b表的where條件是個子查詢,這個子查詢不能被改寫成semi join,那麼就是老老實實的子查詢,子查詢的實現等同於nested loop join,就是外表做驅動表,驅動內錶做rescan,b表有1萬條資料,那麼就會驅動aa表1萬次rescan,這個是很恐怖的,乙個查詢的主要代價就是rescan一些掃瞄表的操作,這個是io密集操作,而正真的資料比較操作是CPU密集的,代價不會太高1萬*1萬都可以接受。一般nested loop join和子查詢在外表是小表的時候推薦做,這樣的大表推薦用merge join,所以你的語句改寫成SELECT COUNT(1) FROM log_01 b join log_01 a on b.

_time = a._time AND b.carid = a.

carid where a.filename = 'init03' AND b.filename = 'init02',MySQL優化器會對查詢進行優化,選擇merge join的方式,而不是nested loop join,如果樓主還覺得慢,可以為where子句中的字段建索引。

2樓:Bobby

上面的兄弟說清楚了,子查詢語句消耗了效能,可以先求出time的集合,然後遍歷集合作為條件值!另外給字段加索引是非常有效的方法

3樓:

追求效率的時候就盡量不要用子查詢。

而且一般子查詢的用法都是查詢出乙個集合然後再從這個集合裡select。你這個相當於是個二重迴圈。。對於每一行都要做一次select,不慢就有鬼了。

SELECT COUNT(*)

FROM log_01 a, log_01 bWHERE a.filename = 'init03'

AND b.filename = 'init02'

AND a._time = b._timeAND a.carid = b.carid還嫌慢的話explain一下,把該加的索引加上就好了。

mysql中not in和not exists兩種查詢到底哪種快

聿明leslie 看了這個問題的不少答案,給我的感覺就是回答得都太過表面。雖然在OceanBase我是從事SQL方向研發工作的,但總的來說,我實在害怕回答SQL方向的問題,給我的感覺就是每次看到這類問題,都太難回答了。混跡知乎的資料庫板塊好幾年,看了好多問題,總體感覺就是國內研究資料庫的環境太差,大...

Mysql中怎樣實現check約束?

愛可生雲資料庫 現在要說的是在列這一層次過濾的基於表定義之前就規範好的 CHECK 約束。MySQL 版本 8.0.16 mysql create table f1 r1 int constraint tb f1 r1 chk1 check mod r1,3 0 Query OK,0 rows af...

MySQL中NULL值有什麼意義?

Jack 自己回答自己的問題吧。先吐槽下知乎,居然沒有顯示問題提問時間的地方。這個問題大概是自己剛剛入行做DBA 的時候,一直沒搞懂NULL到底是幹嘛的,後來經過陸續的學習了解,有了一些認知 NULL值的含義 1.NULL不是空 2.什麼是空,空就是沒有,比如說,錢包裡是空的,這個位置沒人佔,但是,...