Java無符號整形
索引的的建立跟儲存的引擎是掛鉤的,儲存引擎表示不同資料在不同磁碟的不同組織形式。
聚簇索引與非聚簇索引:取決於資料與索引是否是放在一起的。
例如InnoDb就是隻能有一個聚簇索引但可以有很多非聚簇索引(向InnoDb插入資料的時候必須要包含一個索引的key值,而且你建立表的時候如果不設定索引,索引的key值可以是主鍵,這也就是你平時建立表的時候為什麼最好設定一個id欄位,並且設定為主鍵自增。如果也沒有主鍵的話,會使用唯一鍵作為索引,如果還沒有唯一鍵的話,就會自生成一個,不同的資料庫不同,但生成的這個是不可見的)
回表:
索引覆蓋:
組合索引(最左匹配):
平時用的SQL查詢語句一般都有比較多的限制條件,所以為了進一步榨取MySQL的效率,就要考慮建立組合索引。例如上表中針對title和time建立一個組合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立這樣的組合索引,其實是相當於分別建立了下面兩組組合索引:
–title,time
–title
為什麼沒有time這樣的組合索引呢?這是因為MySQL組合索引“最左字首”的結果。簡單的理解就是隻從最左面的開始組合。並不是只要包含這兩列的查詢都會用到該組合索引,如下面的幾個SQL所示
–使用到上面的索引 SELECT* FROM article WHREE title=’測試’ AND time=1234567890; SELECT * FROM article WHREE title=’測試’; –不使用上面的索引 SELECT * FROM article WHREE time=1234567890;
索引下推(瞭解即可):
首先來說一下索引使用是的小技巧:
1.索引不會包含有NULL的列
只要列中包含有NULL值,都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此符合索引就是無效的。
2.使用短索引
對串列進行索引,如果可以就應該指定一個字首長度。例如,如果有一個char(255)的列,如果在前10個或20個字元內,多數值是唯一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和I/O操作。
3.索引列排序
mysql查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作,儘量不要包含多個列的排序,如果需要最好給這些列建複合索引。
4.like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,注意正確的使用方式。like ‘%aaa%’不會使用索引,而like ‘aaa%’可以使用索引。
5.不要在列上進行運算
6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的
7.索引要建立在經常進行select操作的欄位上。
這是因為,如果這些列很少用到,那麼有無索引並不能明顯改變查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。
8.索引要建立在值比較唯一的欄位上。
9.對於那些定義為text、image和bit資料型別的列不應該增加索引。因為這些列的資料量要麼相當大,要麼取值很少。
10.在where和join中出現的列需要建立索引。
11.where的查詢條件裡有不等號(where column != …),mysql將無法使用索引。
12.如果where字句的查詢條件裡使用了函式(如:where DAY(column)=…),mysql將無法使用索引。
13.在join操作中(需要從多個數據表提取資料時),mysql只有在主鍵和外來鍵的資料型別相同時才能使用索引,否則及時建立了索引也不會使用。