在數據庫中合理的使用索引是提高mysql數據庫的一種高效和快捷的方式,可是在索引的使用上在個人使用中發現有不少坑,由於本身以前沒有認識到,因此來總結一下html
索引是一種特殊的文件,其中包含着對數據表中的全部記錄的引用指針mysql
字段中存儲的內容重複性不能太高,好比性別,顏色等這些可區分性很低的字段sql
字段會常常性的用做查詢語句。 由於建立索引也是須要存儲的空間的,並且建立了索引會形成insert等語句的速度變慢數據庫
字段更新的斌率不高的字段適合添加索引。數據的更新會帶來索引的更新。指針
普通索引 : key
。惟一的做用就是加快查詢的速度code
主鍵索引 : primary key
。字段具有惟一性 一張數據表中只有一個regexp
惟一索引 : unique key
。htm
聯合索引 : key(a,b,c)
。索引
外鍵索引 : 在我如今的認識中,就是用來維護數據表之間的相關性的,而且會致使數據的寫入等操做的速度過慢,因此。。好像沒啥用(對於較大的項目)字符串
全文索引 : FULLTEXT(column1, column2)
mysql5.6之前的InnoDB表不支持。使用:WHERE MATCH(column) AGAINST('search_content')
索引字段上使用 WHERE DAY(column)='' 或
WHERE column*2=100
這種運算,索引不會被使用到
在索引的字段上 使用NOT IN
,<>
,!=
這些運算符的時候,執行explain會使用到索引,可是這些操做是不被推崇的,由於就算是用到了索引速度也不會很快.並且在mysql的5.6版本之前這種方式就算執行explain
操做也是是用不到索引的
在索引字段上使用 like
或regexp
操做的時候,%
的通配符不能放在要查找的字符串的左側(能夠想象使用索引的時候就是在查字典,好比想要找到'mysql'這個單詞,須要從m開始,而後是y,因此查詢的順序就是從左往右的)
關於聯合索引的一些注意事項:
若是給一張表添加的一組聯合索引以下: key(name,email,age)
,mysql在添加聯合索引的時候以‘最左前綴’的形式進行索引的添加,那麼在進行查詢select *
的時候[name] [name,email] [name,email,age]
這三組查詢條件都是可使用到這個組合索引的,可是這並非重點
若是如今使用 explain select * from table where age=11
會發現索引並無被使用到。 但是執行 explain select name,email from table where age=11
.會發現這個索引被使用到了。 這種方式叫作索引覆蓋,在執行explain語句的時候,會發現extra一欄中衛'Using Index',若是存儲引擎使用的是InnoDB,二級索引也存儲了primary key的值,若是用過索引去訪問primary key的值,也能夠訪問到
還有就是 關於添加聯合索引仍是單列索引的問題。若是字段都被添加成單列的索引,相比於聯合索引的話,會增長數據庫的IO的等待
索引的確能夠加快mysql在查詢時候的速度。可是在數據進行新增及更新等操做的時候,也須要對應的維護索引關係(可是也有配置能夠在數據:DELAY_KEY_WRITE,不深刻展開)
在使用多個條件進行數據的查詢的時候,有網上的不少說法都是mysql中單次sql的查詢只能使用到一個索引(這個是錯誤的!!) 一條sql語句,針對一張表的查詢,多個條件之間使用and
拼接的話,索引在mysql內部會被執行 union的操做,索引是可使用到的! 可是!若是條件之間使用or
進行條件的拼接的話,那麼若是想要該語句的索引有效就必須保證每一個被or
鏈接的條件均可以使用到索引。
好比果我如今想要給 用戶表的用戶家庭住址字段添加索引,該字段:address
的類型爲varchar(255) ,對整個字段創建索引的話確定是不合理的,這個時候須要爲該字段的前n個值創建索引。可使用 select count(distinct substring(字段,1,結束位置)) from 表
對比一下表中的總數據看一下該n值得選擇性,用來肯定索引的長度