day7-mysql引擎和索引


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='張三'

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM