索引是一種特殊的文件(InnoDB數據表上的索引是表空間的一個組成部分),它們包含著對數據表里所有記錄的引用指針。
注:
[1]索引不是萬能的!索引可以加快數據檢索操作,但會使數據修改操作變慢。每修改數據記錄,索引就必須刷新一次。為了在某種程序上彌補這一缺陷,許 多SQL命令都有一個DELAY_KEY_WRITE項。這個選項的作用是暫時制止MySQL在該命令每插入一條新記錄和每修改一條現有之后立刻對索引進 行刷新,對索引的刷新將等到全部記錄插入/修改完畢之后再進行。在需要把許多新記錄插入某個數據表的場合,DELAY_KEY_WRITE選項的作用將非 常明顯。
[2]另外,索引還會在硬盤上占用相當大的空間。因此應該只為最經常查詢和最經常排序的數據列建立索引。注意,如果某個數據列包含許多重復的內 容,為它建立索引就沒有太大的實際效果。
從理論上講,完全可以為數據表里的每個字段分別建一個索引,但MySQL把同一個數據表里的索引總數限制為16個。
1. InnoDB數據表的索引
與MyISAM數據表相比,索引對InnoDB數據的重要性要大得多。在InnoDB數據表上,索引對InnoDB數據表的重要性要在得多。在 InnoDB數據表上,索引不僅會在搜索數據記錄時發揮作用,還是數據行級鎖定機制的苊、基礎。”數據行級鎖定”的意思是指在事務操作的執行過程中鎖定正 在被處理的個別記錄,不讓其他用戶進行訪問。這種鎖定將影響到(但不限于)SELECT…LOCK IN SHARE MODE、SELECT…FOR UPDATE命令以及INSERT、UPDATE和DELETE命令。
出于效率方面的考慮,InnoDB數據表的數據行級鎖定實際發生在它們的索引上,而不是數據表自身上。顯然,數據行級鎖定機制只有在有關的數據表有一個合 適的索引可供鎖定的時候才能發揮效力。
2. 限制
如果WEHERE子句的查詢條件里有不等號(WHERE coloum != …),MySQL將無法使用索引。
類似地,如果WHERE子句的查詢條件里使用了函數(WHERE DAY(column) = …),MySQL也將無法使用索引。
在JOIN操作中(需要從多個數據表提取數據時),MySQL只有在主鍵和外鍵的數據類型相同時才能使用索引。
如果WHERE子句的查詢條件里使用比較操作符LIKE和REGEXP,MySQL只有在搜索模板的第一個字符不是通配符的情況下才能使用索引。比如說, 如果查詢條件是LIKE ‘abc%',MySQL將使用索引;如果查詢條件是LIKE ‘%abc',MySQL將不使用索引。
在ORDER BY操作中,MySQL只有在排序條件不是一個查詢條件表達式的情況下才使用索引。(雖然如此,在涉及多個數據表查詢里,即使有索引可用,那些索引在加快 ORDER BY方面也沒什么作用)
如果某個數據列里包含許多重復的值,就算為它建立了索引也不會有很好的效果。比如說,如果某個數據列里包含的凈是些諸如”0/1″或”Y/N”等值,就沒 有必要為它創建一個索引。             
新聞熱點
疑難解答