一:數(shù)據(jù)庫基礎(chǔ)知識
Innodb引擎
Innodb引擎提供了對數(shù)據(jù)庫ACID事務(wù)的支持,并且實現(xiàn)了SQL標準的四種隔離級別,關(guān)于數(shù)據(jù)庫事務(wù)與其隔離級別的內(nèi)容請見數(shù)據(jù)庫事務(wù)與其隔離級別這篇文章。該引擎還提供了行級鎖和外鍵約束,它的設(shè)計目標是處理大容量數(shù)據(jù)庫系統(tǒng),它本身其實就是基于MySQL后臺的完整數(shù)據(jù)庫系統(tǒng),MySQL運行時Innodb會在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引。但是該引擎不支持FULLTEXT類型的索引,而且它沒有保存表的行數(shù),當SELECT COUNT(*) FROM TABLE時需要掃描全表。當需要使用數(shù)據(jù)庫事務(wù)時,該引擎當然是首選。由于鎖的粒度更小,寫操作不會鎖定全表,所以在并發(fā)較高時,使用Innodb引擎會提升效率。但是使用行級鎖也不是絕對的,如果在執(zhí)行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表。
MyIASM引擎
MyIASM是MySQL默認的引擎,但是它沒有提供對數(shù)據(jù)庫事務(wù)的支持,也不支持行級鎖和外鍵,因此當INSERT(插入)或UPDATE(更新)數(shù)據(jù)時即寫操作需要鎖定整個表,效率便會低一些。不過和Innodb不同,MyIASM中存儲了表的行數(shù),于是SELECT COUNT(*) FROM TABLE時只需要直接讀取已經(jīng)保存好的值而不需要進行全表掃描。如果表的讀操作遠遠多于寫操作且不需要數(shù)據(jù)庫事務(wù)的支持,那么MyIASM也是很好的選擇。
唯一索引(聚集索引)
單個表只能有一個唯一索引,索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。數(shù)據(jù)存儲結(jié)構(gòu)和索引存儲結(jié)構(gòu)順序一致。(一般主鍵為唯一索引)
創(chuàng)建單列索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumn