上面的3段sql,在MYSQL中執(zhí)行,哪一個效率最優(yōu),請講出原因
看到這個問題,我想起了之前作面試官的時候,也問過這里的問題。從另一個角度,我收集了大家面對這題目的時候一些思考,總結成下面的一個面試小故事。
這類題目真得蠻適合面試的時候考察對sql的掌握程度。
模擬一個場景,面試者:小白,面試官:小二,下面開始這段面試過程…..
小二:…. 我這里有個小問題,你看看(給出上面3段sql),balabala。。
小白:這2個表數據量如何了,join ,子查詢的優(yōu)化根據數據量可能還有所不一樣吧。子查詢適合外結果集大,子查詢結果集小的情況,最好是能保證子查詢所返回的結果集盡量的小。
小二:假設2表,數據量差不多,都是萬條記錄左右。
小白:如果是這種的話,A應該會慢一點吧。 如果是在mysql上執(zhí)行的話,A中子查詢語句會認為與外面的simolified表進行關聯比較有效率。這樣的話A其實就回被翻譯成:
select title from simplified where exists (select simplified.title from analysis where word= ‘something’ and id =simplified .id);
這種in子查詢的形式,在外部表(比如上面的simplified )數據量較大的時候效率是很差的.
小二: 恩,那么B和C之間有什么區(qū)別呢?
小白:B和C在我看來,應該是差不多的,其主要區(qū)別就是B采用了別名。但是我認為應該是沒多大影響的。
因為數據庫本身執(zhí)行時,都會再把表名給換成自己的別名。但我影響中好像記得有一條數據庫的優(yōu)化建議是盡量多表連接,最好是使用表的別名來引用列。
對了,有對id建索引吧。
小二: 2表id都是主鍵,這算是建了索引嗎?
小白: 是的,主鍵可以保證記錄的唯一和主鍵域非空,數據庫管理系統(tǒng)對于主鍵自動生成唯一索引,所以主鍵也是一個特殊的索引。
小二: 恩,一張表只能有一個主鍵,是不是就可以說只能有一個唯一的索引呢?
小白: 不對,主鍵一定是唯一性索引,唯一性索引并不一定就是主鍵,主鍵就是能夠唯一標識表中某一行的屬性或屬性組,一個表只能有一個主鍵,但可以有多個候選索引。
小二: 主鍵列和唯一索引列還有區(qū)別嗎?
小白:應該有,我知道的主鍵列不允許空值,而唯一性索引列允許空值。一個表中可以有多個唯一性索引,但只能有一個主鍵。
小二: 恩,回到上面的問題,你記得多表連接,最好使用表的別名來引用列,哪你有想過會是什么原因導致的呢?
小白:我估計應該是Mysql內部處理邏輯有關吧,有可能是使用了別名,就會再建一個臨時表放入內存,這樣后面的命中會更高。
小二: 差不多吧,mysql引擎自動生成temp表,造成緩存的效果。從這個sql,你大致應該能明白它的意圖了,你想想有沒有更優(yōu)的寫法,可以試試看…
小白: 好的,我想想…..
小白:
select b.title from
(select id from analysis where word=’something’)a,
simplified b
where a.id=b.id;
如果這么去寫,應該是最快的。放棄子查詢和join。
小二: 恩,不錯…..
。。。
如果我在面試中碰到這樣的小白,絕對會留下深刻的影響。
原文地址:關于子查詢和連接的趣味小題目, 感謝原作者分享。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com