MySQL裡幾個查詢語句的效能優化論證

2021-09-28 11:44:52 字數 879 閱讀 9399

前幾天在網上看了乙個帖子,描述的現象是在mysql中,對in,or,union all的效能的比對,看完之後,我就產生了疑問。

文章的大意是說,使用in,or的查詢效率較低,大概查詢需要花費11秒,而使用了union all的方式之後,效能提高到了0.02秒。

如果單純說是mysql半連線的優化器效能問題,我信,但是看了文中提供的sql語句,我感覺至少從我使用mysql 5.7的感覺來看,這個差別會很小,或者說沒有差別。

當然有這個想法,自己也得論證不是。我就嘗試了兩次,文中說資料量大概是20萬記錄,那我就擴大一下,做一下100萬資料的測試,看看效果。

建立表article,

create table article(id int primary key ,article_category int);

使用如下的方式初始化資料。

插入資料,這個部分,我啟用了顯式事務,效果很明顯。在本機測試100萬的資料量大概是21秒鐘即可完成。

繼續執行上面的語句,效能還不錯,基本都在1秒鐘(當然資料是在快取裡面),三種方式的效能有差異,但是遠沒有穩中說得那麼大了。

是不是資料量還不夠呢,我們繼續做乙個測試,把初始化資料庫修改為1000萬,再來看看效果。

我們繼續做乙個優化改進,建立乙個索引出來。資料量擴大10倍,為1000萬。

alter table article add key  (article_category,id);

再來看看效果發現上面的3個語句的執行效率相仿。

通過上的測試,充分說明了在mysql 5.7的測試中,這個問題嚴格來說不是問題,可能是版本有關,還有乙個是使用了更多的資料,效能卻明顯好許多。這個可能和表結構有一些出入。

總之,我們得到乙個初步的結論,很可能自己測試的時候卻沒有,需要理性看待。以免得到錯誤的結論。

Mysql查詢語句的效能優化

使用join時,應當用小結果集驅動大結果集 例 user表10000條資料,class表20條資料 select from user u left join class c u.userid c.userid 這樣則需要用user表迴圈10000次才能查詢出來,而如果用class表驅動user表則只...

mysql常用效能查詢語句

檢視mysql本次啟動後的執行時間 單位 秒 show status like uptime 檢視select語句的執行數 show status like com select 檢視insert語句的執行數 show status like com insert 檢視update語句的執行數 sh...

mysql裡連線查詢語句 MySQL 連線查詢

1 如何使用 mysql 的 join 在兩個或多個表中查詢資料 可以在select,update 和 delete 語句中使用 mysql 的 join 來聯合多表查詢。join 按照功能大致分為如下三類 1 inner join 內連線,或等值連線 獲取兩個表中字段匹配關係的記錄。2 left ...