程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 淺談MyISAM 和 InnoDB 的差別與優化

淺談MyISAM 和 InnoDB 的差別與優化

編輯:MySQL綜合教程

淺談MyISAM 和 InnoDB 的差別與優化。本站提示廣大學習愛好者:(淺談MyISAM 和 InnoDB 的差別與優化)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談MyISAM 和 InnoDB 的差別與優化正文


MyISAM 和 InnoDB 的根本差別

1.InnoDB不支撐FULLTEXT類型的索引。

2.InnoDB 中不保留表的詳細行數,也就是說,履行select count(*) from table時,InnoDB要掃描一遍全部表來盤算有若干行,然則MyISAM只需簡略的讀出保留好的行數便可。留意的是,當count(*)語句包括 where前提時,兩種表的操作是一樣的。

3.關於AUTO_INCREMENT類型的字段,InnoDB中必需包括只要該字段的索引,然則在MyISAM表中,可以和其他字段一路樹立結合索引。

4.DELETE FROM table時,InnoDB不會從新樹立表,而是一行一行的刪除。MyISAM 是表所 innodb是行鎖

5.LOAD TABLE FROM MASTER(從主負載表)操尴尬刁難InnoDB是不起感化的,處理辦法是起首把InnoDB表改成MyISAM表,導入數據後再改成InnoDB表,然則關於應用的額定的InnoDB特征(例如外鍵)的表不實用。

別的,InnoDB表的行鎖也不是相對的,假如在履行一個SQL語句時MySQL不克不及肯定要掃描的規模,InnoDB表異樣會鎖全表,例如update table set num=1 where name like “"2%”

6.InnoDB 支撐事物

選擇存儲引擎 依據現實情形選擇。

普通情形下假如查詢多建議應用myIsam 。

假如你須要事務處置或是外鍵,那末InnoDB 能夠是比擬好的方法。

MyISAM和InnoDB優化:

  key_buffer_size - 這對MyISAM表來講異常主要。假如只是應用MyISAM表,可以把它設置為可用內存的 30-40%。公道的值取決於索引年夜小、數據量和負載 -- 記住,MyISAM表會應用操作體系的緩存來緩存數據,是以須要留出部門內存給它們,許多情形下數據比索引年夜多了。雖然如斯,須要老是檢討能否一切的 key_buffer 都被應用了 -- .MYI 文件只要 1GB,而 key_buffer 卻設置為 4GB 的情形長短常少的。這麼做太糟蹋了。假如你很少應用MyISAM表,那末也保存低於 16-32MB 的 key_buffer_size 以順應賜與磁盤的暫時表索引所需。

  innodb_buffer_pool_size - 這對Innodb表來講異常主要。Innodb比擬MyISAM表對緩沖更加敏感。MyISAM可以在默許的 key_buffer_size 設置下運轉的可以,但是Innodb在默許的innodb_buffer_pool_size 設置下卻跟蝸牛似的。因為Innodb把數據和索引都緩存起來,無需留給操作體系太多的內存,是以假如只須要用Innodb的話則可以設置它高達 70-80% 的可用內存。一些運用於 key_buffer 的規矩有 -- 假如你的數據量不年夜,而且不會暴增,那末無需把innodb_additional_pool_size - 這個選項對機能影響其實不太多,至多在有差不多足夠內存可分派的操作體系上是如許。不外假如你依然想設置為 20MB(或許更年夜),是以就須要看一下Innodb其他須要分派的內存有若干。

       innodb_log_file_size 在高寫入負載特別是年夜數據集的情形下很主要。這個值越年夜則機能絕對越高,然則要留意到能夠會增長恢復時光。我常常設置為 64-512MB,跟據辦事器年夜小而異。

      innodb_log_buffer_size 默許的設置在中等強度寫入負載和較短事務的情形下,辦事器機能還可以。假如存在更新操作峰值或許負載較年夜,就應當斟酌加年夜它的值了。假如它的值設置太高了,能夠會糟蹋內存 -- 它每秒都邑刷新一次,是以無需設置跨越1秒所需的內存空間。平日 8-16MB 就足夠了。越小的體系它的值越小。

      innodb_flush_logs_at_trx_commit 能否為Innodb比MyISAM慢1000倍而頭年夜?看來或許你忘了修正這個參數了。默許值是 1,這意味著每次提交的更新事務(或許每一個事務以外的語句)都邑刷新到磁盤中,而這相當消耗資本,特別是沒有電池備用緩存時。許多運用法式,特別是從 MyISAM改變過去的那些,把它的值設置為 2 便可以了,也就是不把日記刷新到磁盤上,而只刷新到操作體系的緩存上。日記依然會每秒刷新到磁盤中去,是以平日不會喪失每秒1-2次更新的消費。假如設置為 0 就快許多了,不外也絕對不平安了 -- MySQL辦事器瓦解時就會喪失一些事務。設置為 2 批示喪失刷新到操作體系緩存的那部門事務。

      table_cache -- 翻開一個表的開支能夠很年夜。例如MyISAM把MYI文件頭標記該表正在應用中。你確定不願望這類操作太頻仍,所以平日要加年夜緩存數目,使得足以最年夜限制地緩存翻開的表。它須要用到操作體系的資本和內存,對以後的硬件設置裝備擺設來講固然不是甚麼成績了。假如你有200多個表的話,那末設置為 1024 或許比擬適合(每一個線程都須要翻開表),假如銜接數比擬年夜那末就加年夜它的值。我已經見過設置為 100,000 的情形。

      thread_cache -- 線程的創立和燒毀的開支能夠很年夜,由於每一個線程的銜接/斷開都須要。我平日至多設置為 16。假如運用法式中有年夜量的騰躍並發銜接而且 Threads_Created 的值也比擬年夜,那末我就會加年夜它的值。它的目標是在平日的操作中無需創立新線程。

      query_cache -- 假如你的運用法式有年夜量讀,並且沒有運用法式級其余緩存,那末這很有效。不要把它設置太年夜了,由於想要保護它也須要很多開支,這會招致MySQL變慢。平日設置為 32-512Mb。設置完以後最好是跟蹤一段時光,檢查能否運轉優越。在必定的負載壓力下,假如緩存射中率太低了,就啟用它。

      sort_buffer_size --假如你只要一些簡略的查詢,那末就無需增長它的值了,雖然你有64GB 的內存。弄欠好或許會下降機能

優化MYSQL數據庫的辦法:

1,拔取最實用的字段屬性,盡量削減界說字段長度,盡可能把字段設置NOT NULL,例如'省分,性別',最好設置為ENUM

2,應用join取代子查詢

3,應用結合(UNION)來取代手動創立的暫時表

4,事務處置(包管數據完全性,例如添加和修正同時,二者成立則都履行,一者掉敗都掉敗)

5,恰當樹立索引(若何樹立索引?索引的利與弊?)

6,優化sql語句

7,explain可以看到mysql履行籌劃

8,分表(垂直分表,程度分表?)

以上所述就是本文的全體內容了,願望年夜家可以或許愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved