Mysql 中建立索引和索引的使用問題

在數據庫中合理的使用索引是提高mysql數據庫的一種高效和快捷的方式,可是在索引的使用上在個人使用中發現有不少坑,由於本身以前沒有認識到,因此來總結一下html


索引的介紹

索引是一種特殊的文件,其中包含着對數據表中的全部記錄的引用指針mysql

添加索引的條件

  1. 字段中存儲的內容重複性不能太高,好比性別,顏色等這些可區分性很低的字段sql

  2. 字段會常常性的用做查詢語句。 由於建立索引也是須要存儲的空間的,並且建立了索引會形成insert等語句的速度變慢數據庫

  3. 字段更新的斌率不高的字段適合添加索引。數據的更新會帶來索引的更新。指針

索引的類型

  1. 普通索引 : key 。惟一的做用就是加快查詢的速度code

  2. 主鍵索引 : primary key 。字段具有惟一性 一張數據表中只有一個regexp

  3. 惟一索引 : unique keyhtm

  4. 聯合索引 : key(a,b,c)索引

  5. 外鍵索引 : 在我如今的認識中,就是用來維護數據表之間的相關性的,而且會致使數據的寫入等操做的速度過慢,因此。。好像沒啥用(對於較大的項目)字符串

  6. 全文索引 : FULLTEXT(column1, column2) mysql5.6之前的InnoDB表不支持。使用:WHERE MATCH(column) AGAINST('search_content')

索引在使用上的注意點

  1. 索引字段上使用 WHERE DAY(column)='' 或 WHERE column*2=100這種運算,索引不會被使用到

  2. 在索引的字段上 使用NOT IN,<>,!=這些運算符的時候,執行explain會使用到索引,可是這些操做是不被推崇的,由於就算是用到了索引速度也不會很快.並且在mysql的5.6版本之前這種方式就算執行explain操做也是是用不到索引的

  3. 在索引字段上使用 likeregexp操做的時候,%的通配符不能放在要查找的字符串的左側(能夠想象使用索引的時候就是在查字典,好比想要找到'mysql'這個單詞,須要從m開始,而後是y,因此查詢的順序就是從左往右的)

  4. 關於聯合索引的一些注意事項:

    1. 若是給一張表添加的一組聯合索引以下: key(name,email,age) ,mysql在添加聯合索引的時候以‘最左前綴’的形式進行索引的添加,那麼在進行查詢select *的時候[name] [name,email] [name,email,age] 這三組查詢條件都是可使用到這個組合索引的,可是這並非重點

    2. 若是如今使用 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的值,也能夠訪問到

  5. 還有就是 關於添加聯合索引仍是單列索引的問題。若是字段都被添加成單列的索引,相比於聯合索引的話,會增長數據庫的IO的等待

  6. 索引的確能夠加快mysql在查詢時候的速度。可是在數據進行新增及更新等操做的時候,也須要對應的維護索引關係(可是也有配置能夠在數據:DELAY_KEY_WRITE,不深刻展開)

  7. 在使用多個條件進行數據的查詢的時候,有網上的不少說法都是mysql中單次sql的查詢只能使用到一個索引(這個是錯誤的!!) 一條sql語句,針對一張表的查詢,多個條件之間使用and拼接的話,索引在mysql內部會被執行 union的操做,索引是可使用到的! 可是!若是條件之間使用or進行條件的拼接的話,那麼若是想要該語句的索引有效就必須保證每一個被or鏈接的條件均可以使用到索引。

索引的長度

好比果我如今想要給 用戶表的用戶家庭住址字段添加索引,該字段:address 的類型爲varchar(255) ,對整個字段創建索引的話確定是不合理的,這個時候須要爲該字段的前n個值創建索引。可使用
select count(distinct substring(字段,1,結束位置)) from 表對比一下表中的總數據看一下該n值得選擇性,用來肯定索引的長度

相關文章
相關標籤/搜索