2015-02-06 159 views
2

請查找下面的'test'表結構,它有5566行。 test_table_structure
請找到下面的查詢的解釋細節:
具有相同數據的兩個MYSQL表具有不同的大小

select * from test where sig_date='2014-03-15' and symbol='AXP' order by score; 

test_table_explain
我創建相同的結構表不同的名稱,並用複合主鍵和插入存在於「測試」相同的數據表。 test_com_indx_strcture
現在解釋查詢和它僅選擇9記錄:

select * from test_com_indx where sig_date='2014-03-15' and symbol='AXP' order by score; 

test_with_composite_index
當我檢查了2個表的大小,test_com_indx佔據更大的空間,這兩個表具有相同的數據。 table_space_details
我的看法是,作爲'測試'表有PRIMARY KEY作爲ID,數據按ID的順序phistically存儲。 和'test_com_indx'表中,數據按照複合PRIMARY KEY的順序進行物理存儲。因此,對於兩個表 都沒有單獨的索引副本,並且兩個表應具有相同的大小。

如果我的假設錯誤以及爲什麼兩個表具有不同的大小,請糾正我?

在此先感謝。

+0

多少空間是「更大的空間」? – 2015-02-06 07:13:48

+0

請檢查我在問題 – user3796869 2015-02-06 07:20:00

+0

添加的細節它是否有相同的行總數? 'select test(*)from test''select count(*)from test_com_indx'? – 2015-02-06 07:26:49

回答

1

做一些閱讀,從information_schema.TABLES的結果可能會與現實不同步,這將解釋爲什麼你的TABLE_ROWS是不同的。運行ANALYZE TABLE test, test_com_indx可能會使它們同步。

如果之後的大小保持不同,或者我錯誤地解析了ANALYZE問題,或者是因爲您的架構存在這些差異。

  • test_com_indx正在使用VARCHAR(10),測試有VARCHAR(25)
  • 測試有一個額外的INTEGER ID列並且必須跟蹤AUTOCOMMIT。
  • test_com_indx有一個複雜的主鍵。

或/和其因爲有不能保證有關,即使你做同樣的事情兩次的內部是如何工作的。 SQL數據庫是聲明性的,你不應該知道它是如何回答你的查詢的,這就釋放了服務器去做最有效的事情。這可能有很多原因...

  • INSERT的順序可以改變數據的存儲方式。
  • 索引可以改變數據的存儲方式。
  • InnoDB does not store one table per file。它們都混合在一個表空間中。一個表中的更改可能會改變另一個表的內部存儲。
相關問題