2017-04-18 42 views
0

我今天在想這個問題...Mysql - 「SELECT字段」會將內存填充爲「SELECT *」? - Innodb

如果我有,例如,一個有20個字段,100K行innodb表....如何內存充滿了這兩個不同的查詢:

1) SELECT field1, field2, field3 from table where field10 = '1'; 

2) Select * from table where field10 = '1'; 

在這兩種情況下內存是否填滿了整個表格? 當innodb_buffer_pool被填滿時,如何考慮哪裏?

回答

2

如果您的field10被索引,InnoDB只需要讀取索引來查找具有該值的行。然後它需要讀取包含這些行的表的頁面。它不需要讀取整個表格。

這是索引的好處。

如果索引還包括field1,field2,field3那麼InnoDB可以跳過從表中讀取頁面。它可以從索引中獲得所需的值。

ALTER TABLE `table` ADD KEY (field10, field1, field2, field3); 

有點像當你在電話簿中查找某個人的姓名並且你發現他們的地址是一個「額外」字段。這本書沒有按照這個人的地址排序,但你可以免費得到它。

這就是所謂的,當您從索引中獲取所需的列時,該索引將覆蓋索引,並且查詢不必從表中讀取整行。

你可能會喜歡我的演講https://www.slideshare.net/billkarwin/how-to-design-indexes-really

+0

你好比爾,thaks爲您呈現,這是非常有趣的,我要讀這一切! 只是多一個好奇心,答案也是一樣的更新查詢? 如果我有一個2 GB的表,例如,我做了10行更新,只有10行被加載到緩衝區中嗎? – Jung

+0

對。該索引有助於任何查詢縮小「檢查行」的範圍。已檢查的行加載到緩衝池中,以便可以爲每行應用WHERE子句中的SQL條件。 –