Mysql索引介紹

什麼是索引?我們可以這麼理解,索引就好比是一本書的目錄,拿一本你不瞭解的書給你,讓你找某一個知識點最快的方式就是先查找目錄,定位頁數然後直接翻到具體頁數。

使用索引的好處

  • 避免了檢索數據時磁盤的 全表掃描,可以節省掃描時間,可以節省記錄排隊進入內存的和CPU的時間
  • 對於多表連接和嵌套查詢更加有利;select * from stu_info where id in(select s_id from marks_info where marks>60)
  • 對特定的索引列找出MAX()或MIN()值。

使用索引的缺點

  • 索引文件佔用磁盤空間
  • 如果建立的索引過多,那麼掃描,索引目錄文件浪費時間過多;
  • 雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE,MySQL不僅要保存數據,還要保存一下索引文件。

查看索引

  • desc tbname;

    Key字段: MUL普通 pri主鍵 uni唯一

  • show index from 表名;//查看錶的索引

  • explain 分析sql的索引使用情況

Mysql中主要有4類索引

  1. 主鍵索引(primary key)
  2. 唯一索引(unique)
  3. 常規索引(index)
  4. 全文索引(fulltext)

根據記錄的特點

  • 普通索引:index(常規索引)

    • 表中的任何字段都可以建立普通索引(記錄可以爲null,記錄可以重複)

      Create index 索引名 on 表名(字段名)

    • 常規索引技術是關係型數據查詢中最重要的技術,如果要提升數據庫的性能,索引優化是首先應該考慮的,因爲他能使我們的數據庫得到最大性能方面的提升。如果沒有索引的數據表,就沒有排序的數據集合,要查詢數據就需要進行全表掃描。有索引的表是一個在索引列上排序了的數據表,所以可通過索引快速定位記錄。

    • 在Myisam數據表中數據行保存在數據文件中,索引保存在索引文件中。但是在Innodb數據表中,數據與索引放在同一個文件中。

    • 常規索引也存在缺點,例如,佔用磁盤空間,而且還會減慢在索引數據列上的插入、刪除、修改操作,他們也需要按照索引列上的排序格式執行。

    • 因此索引應該創建在搜索、排序、分組等操作所涉及的數據列上。也就是在where子句,多表查詢中的from子句、order by 或 group by 子句中出現過的數據列最合適用來創建這種索引。但是不要建太多索引,索引會消耗資源。

  • 主鍵索引: 記錄不能爲空,記錄不能重複

    主鍵索引是關係型數據庫中最常見的索引類型,主要作用是確定數據表中的一條特定的數據的位置。數據表會根據主鍵的唯一性來唯一標識每條記錄,這樣可以加快尋址定位的速度,最好每張表都指定一個主鍵

    create table 表名(id int(5) primary key;

create table test (

​ Id int(5) not null auto_increment,

​ Name varchar(4) not null,

​ Primary key(id)

);

  • 唯一索引:unique index

    • 唯一索引的記錄可以爲空[null],但是記錄不能重複,與主鍵的不同之處在於每個數據表中只能有一個主鍵索引,但是可以有多個唯一索引,如果能確定某個數據列將只包含彼此各不相同的值,在爲這個數據列創建索引時,就應該使用 unique 把它定義爲一個唯一索引

    • 在有新紀錄插入的時候,就會自動檢測新紀錄的這個字段值,是否已經在某個現有的記錄的這個字段裏出現過了,如果是,Mysql 將拒絕插入這條記錄

    • 其實創建唯一索引的目的往往不是爲了提高訪問速度,而只是爲了避免數據重複。

      Create unique index 索引名 on 表名(字段名)

根據索引的個數

單列索引,以上講的都是單列

多列索引

就是索引內容爲多個字段,建立一個多列索引就相當於建立多個單列索引,建立兩個字段的多列索引就相當於建立了三個索引,在創建索引的時候,儘量創建多列索引。

  • 多列普通索引

    create index 索引名 on 表(字段1,字段2)

  • 多列唯一索引

    create unique index 索引名 on 表(字段1,字段2)

  • 多列主鍵索引(複合主鍵)

    錯誤 :

    create table news(
      id int(2) auto_increment primary key,
      name varchar(20) primary key,
    );
    
    

    正確:

    create table 表名(
      字段1,
      字段2,
      ...
      primary key(字段1,字段2……)
    );
    
    

根據內容索引

根據字段的value長度進行建立索引

  • 短索引:

    建立短索引的字段特點: 字符型varchar或者文本型text的字段,字段的內容前半部分出現重複的情況比較少;

    如:河南信陽男子小學門口砍殺24人獲死刑,日韓改變態度允許民航向中國通報飛行計劃,駐歐盟使團發言人:“法輪功”是反華政治組織,灣強制大陸資本21日內撤出有線電視領域,彭麗媛撰文懷念恩師感謝提攜之情 稱其爲伯樂

    title varchar(120)

    create index 索引名 on 表(字段(20))

    create index title on news(title(20))

  • 單列普通短索引

    create index 名 on 表(字段1(長度))

  • 單列唯一短索引

    create unique index 名 on 表(字段1(長度))

  • 單列主鍵短索引

    create table aa(

    ​ id int(11) ,

    ​ ...

    ​ primary key(id(3)

    )

  • 多列普通短索引

    create index 名 on 表(字段1(長度),字段2(長度))

  • 多列唯一短索引

    create unique index 名 on 表(字段1(長度),字段2(長度))

  • 多列主鍵短索引

    create table news_info (

    ​ id int (2),

    ​ title varchar(100),

    ​ author varchar(50),

    ​ content varchar(500),

    ​ primary key(title(20),author(10))

    );

  • 全文索引 fulltext index

    • 如果查詢的字段的部分內容在該內容中出現率>50%或者表中記錄<2條的時候,全文索引沒用

    • 50% 全文索引也沒用

      Create fulltext index 索引名稱 on tbname(column);

    • innodb引擎中沒用

    • MYSQL 默認不開啓 全文索引

      修改mysql配置文件:window服務器爲my.ini,linux服務器爲my.cnf,

      在 [mysqld] 後面加入一行“ft_min_word_len=1”,然後重啓Mysql。

  • 全文索引的使用: 不區分大小寫

    Select xxx from tbname WHERE MATCH (索引字段) AGAINST (‘關鍵字’);

    REPAIR TABLE table_name; 重新加載表內存

Sphinx,dede

刪除索引

drop index 索引名 on 表名

索引沒有名稱怎麼刪除?

ALTER TABLE table_name DROP PRIMARY KEY

建立索引注意要點

  • 檢索速度:主鍵-->唯一-->普通--->沒有索引

  • 索引內容匹配的長度: 能建立短索引儘量的建立短索引

  • 儘量建立多列索引(但是多列索引不能過多)

  • 建立的索引(字段)必須是在where後經常頻繁出現的字段

    1. 表的主鍵、外鍵必須有索引(主鍵默認有索引,外鍵是表與表之間聯繫的字段)
    2. 數據量超過300條記錄的表應該有索引
    3. 經常與其他表進行連接的表,在連接字段上應該建立索引(外鍵)
    4. 經常出現在Where子句中的字段,特別是大表的字段,應該建立索引
    5. 索引應該建在選擇性高的字段上
    6. 對於大的文本字段甚至超長字段應該建立全文索引
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章