MyISAM和InnoDB在索引上的差異及其它區別

 

  首先咱們知道MyISM和InnoDB索引都是由B+樹實現的,但在索引管理數據方式上卻有所不一樣。mysql

  InnoDB是彙集索引,數據文件是和(主鍵)索引綁在一塊兒的,即索引 + 數據 = 整個表數據文件,經過主鍵索引到整個記錄,必需要有主鍵,經過主鍵索引效率很高。可是輔助索引須要兩次查詢,由於輔助索引是以建索引的字段爲關鍵字索引到主鍵,因此須要兩次,先查詢到主鍵,而後再經過主鍵查詢到數據。所以,主鍵不該該過大,由於主鍵太大,其餘索引也都會很大。話很少說上圖:sql

  主鍵索引:以主鍵索引到整條記錄安全

  

  輔助索引:以另外一字段索引到主鍵併發

 

        MyISAM是非彙集索引,也是使用B+Tree做爲索引結構,索引和數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。也就是說:InnoDB的B+樹主鍵索引的葉子節點就是數據文件,輔助索引的葉子節點是主鍵的值;而MyISAM的B+樹主鍵索引和輔助索引的葉子節點都是數據文件的地址指針。性能

  主鍵索引:以關鍵字索引到記錄的地址指針

  輔助索引:以某字段索引到記錄地址blog

  

  從索引實現方面咱們也能夠看出來InnoDB表數據文件自己就是索引文件,他們是一個總體,而對於MyISAM來講數據文件和索引文件則是分開的。索引

  

鎖方面:事務

  mysql支持三種鎖定級別,行級、頁級、表級;字符串

  MyISAM支持表級鎖定,提供與 Oracle 類型一致的不加鎖讀取(non-locking read in SELECTs)

  InnoDB支持行級鎖,但值得注意的是InnoDB的行鎖是加到索引上的,因此在某次查找時沒有用上索引,InnoDB表一樣會鎖全表。

事務方面:

  InnoDB具備事務,支持4個事務隔離級別,回滾,崩潰修復能力和多版本併發的事務安全,包括ACID。若是應用中須要執行大量的INSERT或UPDATE操做,則應該使用InnoDB,以事務爲單位操做能夠提升多用戶併發操做的性能。
  MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。若是應用中須要執行大量的SELECT查詢,那麼MyISAM是更好的選擇

併發

  MyISAM讀寫互相阻塞:不只會在寫入的時候阻塞讀取,MyISAM還會在讀取的時候阻塞寫入,但讀自己並不會阻塞另外的讀。

  InnoDB 讀寫阻塞與事務隔離級別相關。

 其餘

  InnoDB不保存表的具體行數,執行select count(*) from table時須要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只須要讀出該變量便可,速度很快;

 

不使用到索引的狀況:

  用or分隔開的條件,若是or前的條件中的列有索引,然後面的列沒有索引,那麼涉及到的索引都不會被用到,例如:select * from table_name where key1='a' or key2='b';若是在key1上有索引而在key2上沒有索引,則該查詢也不會走索引

  複合索引,若是索引列不是複合索引的第一部分,則不使用索引(即不符合最左前綴),例如,複合索引爲(key1,key2),則查詢select * from table_name where key2='b';將不會使用索引

  若是like是以‘%’開始的,則該列上的索引不會被使用。例如select * from table_name where key1 like '%a';該查詢即便key1上存在索引,也不會被使用

  若是列爲字符串,則where條件中必須將字符常量值加引號,不然即便該列上存在索引,也不會被使用。例如,select * from table_name where key1=1;若是key1列保存的是字符串,即便key1上有索引,也不會被使用。

   where語句中使用 <>和 !=。

相關文章
相關標籤/搜索