mysql中表分類MyISAM和InnoDB的區別

2022-09-12 19:54:11 字數 3151 閱讀 8428

myisam和innodb的區別

1、mysql預設採用的是myisam。

2、myisam不支援事務,而innodb支援。innodb的autocommit預設是開啟的,即每條sql語句會預設被封裝成 乙個事務,自動提交,這樣會影響速度,所以最好是把多條sql語句顯示放在begin和commit之間,組成一 個事務去提交。

3、innodb支援資料行鎖定,myisam不支援行鎖定,只支援鎖定整個表。即myisam同乙個表上的讀鎖和寫鎖是 互斥的,myisam併發讀寫時如果等待佇列中既有讀請求又有寫請求,預設寫請求的優先順序高,即使讀請求 先到,所以myisam不適合於有大量查詢和修改並存的情況,那樣查詢程序會長時間阻塞。因為myisam是鎖 表,所以某項讀操作比較耗時會使其他寫程序餓死。

4、innodb支援外來鍵,myisam不支援。

5、innodb的主鍵範圍更大,最大是myisam的2倍。

6、innodb不支援全文索引,而myisam支援。全文索引是指對char、varchar和text中的每個詞(停用詞除 外)建立倒排序索引。myisam的全文索引其實沒啥用,因為它不支援中文分詞,必須由使用者分詞後加入 空格再寫到資料表裡,而且少於4個漢字的詞會和停用詞一樣被忽略掉。

7、myisam支援gis資料,innodb不支援。即myisam支援以下空間資料物件:point,line,polygon,su***ce 等。

8、沒有where的count(*)使用myisam要比innodb快得多。因為myisam內建了乙個計數器,count(*)時它直接 從計數器中讀,而innodb必須掃瞄全表。所以在innodb上執行count(*)時一般要伴隨where,且where中要 包含主鍵以外的索引列。為什麼這裡特別強調「主鍵以外」?因為innodb中primary index是和raw data 存放在一起的,而secondary index則是單獨存放,然後有個指標指向primary key。所以只是count(*)的 話使用secondary index掃瞄更快,而primary key則主要在掃瞄索引同時要返回raw data時的作用較大。 

myisam

innodb

構成上的區別:

每個myisam在磁碟上儲存成三個檔案。第乙個檔案的名字以表的名字開始,副檔名指出檔案型別。

.frm檔案儲存表定義。

資料檔案的擴充套件名為.myd (mydata)。

索引檔案的副檔名是.myi (myindex)。

基於磁碟的資源是innodb表空間資料檔案和它的日誌檔案,innodb 表的大小只受限於作業系統檔案的大小,一般為 2gb

事務處理上方面:

myisam型別的表強調的是效能,其執行數度比innodb型別更快,但是不提供事務支援

innodb提供事務支援事務,外部鍵等高階資料庫功能

select   update,insertdelete操作

如果執行大量的select,myisam是更好的選擇

1.如果你的資料執行大量的insertupdate,出於效能方面的考慮,應該使用innodb表

2.delete   from table時,innodb不會重新建立表,而是一行一行的刪除。

3.load   table from master操作對innodb是不起作用的,解決方法是首先把innodb表改成myisam表,匯入資料後再改成innodb表,但是對於使用的額外的innodb特性(例如外來鍵)的表不適用

auto_increment的操作

每表乙個auto_incremen列的內部處理。

myisaminsertupdate操作自動更新這一列。這使得auto_increment列更快(至少10%)。在序列頂的值被刪除之後就不能再利用。(當auto_increment列被定義為多列索引的最後一列,可以出現重使用從序列頂部刪除的值的情況)。

auto_increment值可用alter table或myisamch來重置

對於auto_increment型別的字段,innodb中必須包含只有該字段的索引,但是在myisam表中,可以和其他字段一起建立聯合索引

更好和更快的auto_increment處理

如果你為乙個表指定auto_increment列,在資料詞典裡的innodb表控制代碼包含乙個名為自動增長計數器的計數器,它被用在為該列賦新值。

自動增長計數器僅被儲存在主記憶體中,而不是存在磁碟上

關於該計算器的演算法實現,請參考

auto_increment列在innodb裡如何工作

表的具體行數

select count(*) from table,myisam只要簡單的讀出儲存好的行數,注意的是,當count(*)語句包含   where條件時,兩種表的操作是一樣的

innodb 中不儲存表的具體行數,也就是說,執行select count(*) from table時,innodb要掃瞄一遍整個表來計算有多少行

表鎖提供行鎖(locking on row level),提供與 oracle 型別一致的不加鎖讀取(non-locking read in

selects),另外,innodb表的行鎖也不是絕對的,如果在執行乙個sql語句時mysql不能確定要掃瞄的範圍,innodb表同樣會鎖全表,例如update table set num=1 where name like 「%aaa%」

原文:

Hive中表分類

由hive全權管理的表 所謂的管理表指hive是否具備資料的管理許可權,如果該表是管理表,當使用者刪除表的同時,hive也會將表所對應的資料刪除,因此在生產環境下,為了防止誤操作,帶來資料損失,一般考慮將表修改為非管理表 外部表 總結 hive的管理,表結構,hdfs中表的資料檔案,都歸hive全權...

MySQL中表的操作

語法 create table table name field1 datatype,field2 datatype,field3 datatype character set 字符集 collate 校驗規則 engine 儲存引擎 說明 create table class major varc...

MySQL中表連線方式

為了能夠很好理解mysql中表連線方式,以如下兩個表作為例子演示 idname1張三 2李四4王五 idage118 220319 兩表關聯,把左表的列和右表的列通過笛卡爾積的形式表達出來。id name idage1張三 1181張三 2201張三 3192李四 1182李四 2202李四 319...