MySQL引擎
數據庫引擎是用於存儲、處理和保護數據的核心服務。利用數據庫引擎可控制訪問權限並快速處理事務,從而滿足企業內大多數需要處理大量數據的應用程序的要求。
常用的數據引擎
ISAM
它在設計之時就考慮到數據庫被查詢的次數要遠大於更新的次數。因此,ISAM執行讀取操作的速度很快,而且不占用大量的內存和存儲資源。ISAM的兩個主要不足之處在於,它不支持事務處理,也不能夠容錯:如果你的硬盤崩潰了,那么數據文件就無法恢復了,那就必須經常備份你所有的實時數據。
MyISAM
MyISAM是MySQL的ISAM擴展格式和缺省的數據庫引擎。除了提供ISAM里所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制,來優化多個並發的讀寫操作
InnoDB(默認)
InnoDB支持事務處理(transaction process)和支持外來鍵。盡管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了對事務處理和外來鍵的支持,這兩點都是前兩個引擎所沒有的。如前所述,如果你的設計需要這些特性中的一者或者兩者,那你就要被迫使用后兩個引擎中的一個了。
MEMORY
MEMORY是MySQL中一類特殊的存儲引擎。它使用存儲在內存中的內容來創建表,而且數據全部放在內存中。服務器需要有足夠的內存來維持MEMORY存儲引擎的表的使用。它是把數據存到內存中,如果內存出現異常就會影響數據。如果重啟或者關機,所有數據都會消失。因此,基於MEMORY的表的生命周期很短,一般是一次性的。
MySQL 索引
MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那么沒有設計和使用索引的MySQL就是一個人力三輪車。索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。建立索引會占用磁盤空間的索引文件。
索引的查詢原理

索引的的類型
- UNIQUE (唯一索引):不可以出現相同的值,可以有NULL值
- NORMAL (普通索引):允許出現相同的索引內容,如果該字段信息保證不會重復例如身份證號用作索引時,可設置為unique
- PROMARY KEY (主鍵索引):不允許出現相同的值
- FULLTEXT INDEX (全文索引):可以針對值中的某個單詞,但效率確實不敢恭維
- 組合索引:實質上是將多個字段建到一個索引里,列值的組合必須唯一,比如學生選課表中可以將學生ID和課程ID作為一個組合索引。
創建索引
這是最基本的索引,它沒有任何限制。它有以下幾種創建方式:
CREATE [UNIQUE] INDEX indexName ON tableName(columnName(length));
如果是CHAR,VARCHAR類型,length可以小於字段實際長度;如果是BLOB和TEXT類型,必須指定 length。
修改索引
ALTER table tableName ADD INDEX indexName(columnName);
刪除索引
DROP INDEX [indexName] ON tableName;
查詢表索引
SHOW INDEX FROM table_name;
是否執行索引
EXPLAIN select * from user_basic_info where phone = '66666666666';

table:顯示這一行的數據是關於哪張表的type:這是重要的列,顯示連接使用了何種類型。從最好到最差的連接類型為const、eq_reg、ref、range、index和ALL
type顯示的是訪問類型,是較為重要的一個指標,結果值從好到壞依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,一般來說,得保證查詢至少達到range級別,最好能達到ref。
key: 實際使用的索引。如果為NULL,則沒有使用索引。
使用索引的技巧
使用索引時,有一些技巧:
1.索引不會包含有NULL的列,只要列中包含有NULL值,都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那么這一列對於此符合索引就是無效的。
2.使用短索引,對串列進行索引,如果可以就應該指定一個前綴長度。例如,如果有一個char(255)的列,如果在前10個或20個字符內,多數值是唯一的,那么就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁盤空間和I/O操作。
3.對於多列索引,不是使用的第一部分,則不會使用索引。
4.like語句操作,like ‘%aaa%’不會使用索引,而like ‘aaa%’可以使用索引。
5.不要在列上進行運算
6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
7.索引要建立在經常進行select操作的字段上。這是因為,如果這些列很少用到,那么有無索引並不能明顯改變查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
8.索引要建立在值唯一的字段上。
9.在where和join中出現的列需要建立索引。
11.如果where字句的查詢條件里使用了函數(如:where DAY(column)=…),mysql將無法使用索引。
12.使用or查詢的話,每個條件的字段都要加單獨索引。
如下一下例子是不走索引的
1.索引列參入計算或者使用函數進行運算
SELECT * FROM stu WHERE age+10=30;
2.全字段模糊搜索和使用正則表達式
SELECT * FROM student WHERE uname LIKE "%小%"; -- 不走索引 SELECT * FROM student WHERE uname LIKE "小%"; -- 走索引
3.字符串與數字比較
SELECT * FROM student WHERE id="1" -- 走索引 SELECT * FROM student WHERE id=1 -- 不走索引
4.使用或者必須or條件的每一列都要加索引
SELECT * FROM student WHERE id="1" or name='張三';
