Mysql

如何在數據庫中讀取列?

  • July 23, 2017

假設我在 Employee 表中有 10 列,我只需要使用兩個列,即salary and name在下面的查詢中

select salary from Employee where name = 'Scott';

從 6.30 到 8.30(2 分鐘)瀏覽影片後,我的理解是在 RDBMS 數據庫(比如 oracle/Mysql 等)下,即使我必須讀取兩列 DBMS 將從記憶體中的磁碟讀取完整行,然後它將根據名稱過濾行coumn 並最終讀取列工資。那是對的嗎 ?

對於 MySQL 的 InnoDB 引擎…

案例 1(最慢):無索引。它將掃描整個表(所有行)以從中找到帶有薪水的行name = 'Scott' and fetch

案例2 INDEX(name):。這將使用索引非常有效地查找 Scott 行,然後獲取行並獲取薪水。

案例 3(最快) INDEX(name, salary):. 現在,整個查詢可以僅在索引內執行——無需觸及數據中的其餘列。 更多 這稱為“覆蓋”索引。更準確地說:如果整個所需的所有列都在 中找到,那麼只需要觸及索引,而不需要觸及數據。 SELECT``INDEX

數據在一個 BTree 中,由PRIMARY KEY. AnINDEX在不同的 BTree 中,按索引排序。

BTrees 對於查找特定行或基於索引讀取連續行非常有效。請參閱有關 BTree 的 Wikipedia 文章。這也是一個很好的參考: https ://www.percona.com/files/presentations/percona-live/london-2011/PLUK2011-b-tree-indexes-and-innodb.pdf

對於其他數據庫,可能存在差異。

如何儲存行

情況 1 (大多數情況):給定表“記錄”(也稱為“行”)的所有列都儲存在一組連續的數十個甚至數百個字節中。這一切都與其他一百行一起坐在同一個“街區”中。因此,當您從行中獲取任何列時,所有其餘列都已經可用。您的Employee表格範例可能屬於這種情況。RDBMS 優化側重於能夠快速獲取整行,但犧牲了不能快速獲取整列。

案例 2:在某些 DB 實現(包括 MySQL 的 InnoDB)中,大列 (TEXTBLOB) 可能被儲存為“不記錄”。也就是說,它們被放在其他一些塊中。優點()當您不需要那些笨重的部分時,它允許快速掃描行;( ) 通常,您一次只獲取一行的大列。

案例 3:有一種不同類型的數據庫組織,其名稱類似於“列儲存”。這會旋轉數據,以便快速獲取列的所有值,但無法快速獲取單行的所有列。

關注案例 1,因為它很常見。

引用自:https://dba.stackexchange.com/questions/181530