1. 程式人生 > 資料庫 >Mysql如何適當的新增索引介紹

Mysql如何適當的新增索引介紹

這裡先簡單介紹一下索引:

新增索引是為了提高資料庫查詢效能,索引是最物美價廉的東西了,不用加記憶體,不用改程式,不用調sql,只要執行個正確的create index,查詢的速度就可能提高百倍千倍,這可是有誘惑力的,可是天下沒有沒費的午餐,查詢的速度的提高是以犧牲insert update delete的速度為代價的。而且索引大小一般是資料的三分之一 ,再加上索引要載入進記憶體的,如果全部欄位都加索引會以犧牲記憶體為代價的,所以才要設當的新增索引。

這裡簡單介紹一下mysql中常用索引:

在新增索引之前最好先檢視一下該表中已存在哪些索引:show index from 表名;

1、主鍵索引

注意: 主鍵索引一張表中只能有一個,但是可以新增多個索引 比如:唯一索引、普通索引、全文索引。

主鍵索引:一般在建表的時候就添加了 比如:id 一般是主鍵索引加自動遞增。

建表後新增主鍵索引 :alter table table_name add primary key (column name);

主鍵索引的特點:不能為空且唯一。

2、普通索引

建立普通索引:alter table table_name add index 索引名(column1,column2);

3、唯一索引

建立唯一索引:ALTER TABLE `table_name` ADD UNIQUE (`column`);

唯一索引與主鍵索引的區別:

唯一索引:可以有多個null 但資料內容不能重複

主鍵索引:不能為null,且內容只能唯一。

兩個區別就在於主鍵索引不能為null 唯一索引可以有多個null 其餘都一樣。

4、全文索引

全文索引只有MyISAM有效(mysql5.6之後InnoDB也支援了全文索引)[5.7不支援MyISAM]

全文索引主要針對文字檔案,比如文章、標題。

在建立表時建立全文索引:

    CREATE TABLE `article` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,`title` varchar(200) DEFAULT NULL,`    content` text,PRIMARY KEY (`id`),FULLTEXT KEY `title` (`title`,`content`)
      ) ENGINE=MyISAM(5.6之後InnoDB也支援全文索引 、5.7不支援MyISAM引擎) DEFAULT CHARSET=utf8;

在現有表中建立全文索引:

ALTER TABLE article ADD FULLTEXT INDEX fulltext_article(title,content);

建立完全文索引之後使用也有要注意的地方:

眾所周知在資料庫中進行模糊查詢是使用like關鍵字進行查詢的,例如:

SELECT * FROM article WHERE content LIKE ‘%查詢字串%';

那麼,我們在使用全文索引也這樣使用嗎?當然不是,我們必須使用特有的語法才能使用全文索引進行查詢,例如,我們想要在article表的title和content列中全文檢索指定的查詢字串,我們可以如下編寫SQL語句:

SELECT * FROM article WHERE MATCH(title,content) AGAINST (‘查詢字串');

強烈注意:MySql自帶的全文索引只能對英文進行全文檢索,目前無法對中文進行全文檢索。如果需要對包含中文在內的文字資料進行全文檢索,我們需要採用Sphinx(斯芬克斯)/Coreseek技術來處理中文。

注:目前,使用MySql自帶的全文索引時,如果查詢字串的長度過短將無法得到期望的搜尋結果。MySql全文索引所能找到的詞預設最小長度為4個字元。另外,如果查詢的字串包含停止詞,那麼該停止詞將會被忽略。

如果可能,請儘量先建立表並插入所有資料後再建立全文索引,而不要在建立表時就直接建立全文索引,因為前者比後者的全文索引效率要高。

刪除索引sql語句:alter table table_name drop index 索引名;

通過上面的簡單介紹後,那麼應該在哪些欄位上新增索引呢?

1、 頻繁查詢的欄位,應該建立索引。

2、更新非常頻繁的欄位,不應該建立索引。

3、唯一性太差的欄位,比如 gender欄位,就不應該建立索引。

4、不會出現在where條件之後的欄位,不應該建立索引。

滿足一下條件,應該建立索引:

1、頻繁要查詢的欄位,經常出現在where條件後面的欄位,應該建立索引。

2、更新不頻繁的欄位,可以建立索引。

索引使用的注意事項

1.對於建立的多列索引,只要查詢條件使用了最左邊的列,索引一般就會被使用。

  • 比如我們對title,content 添加了複合索引
  • select * from table_name where title = 'test';會用到索引
  • select * from table_name where content = 'test';不會用到索引

2.對於使用like的查詢,查詢如果是‘%a'不會使用到索引,而 like 'a%'就會用到索引。最前面不能使用%和_這樣的變化值

3.如果條件中有or,即使其中有條件帶索引也不會使用。

4.如果列型別是字串,那一定要在條件中將資料使用引號引用起來。

  • 檢視索引的使用情況:show status like‘Handler_read%';
  • handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。
  • handler_read_rnd_next:這個值越高,說明查詢低效。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。如果你想了解更多相關內容請檢視下面相關連結