1. 程式人生 > >mysql 建議索引的原因以及優缺點

mysql 建議索引的原因以及優缺點

建立索引的優缺點:

為什麼要建立索引呢?

        這是因為,建立索引可以大大提高系統的效能。 
        第一、通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。 
        第二、可以大大加快 資料的檢索速度,這也是建立索引的最主要的原因。 
        第三、可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義。 
        第四、在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間。 
        第五、通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

        也許會有人要問:增加索引有如此多的優點,為什麼不對錶中的每一個列建立一個索引呢?

這種想法固然有其合理性,然而也有其片面性。雖然,索引有許多優點, 但是,為表中的每一個列都增加索引,是非常不明智的。

       這是因為,增加索引也有許多不利的一個方面:

        第一、建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。 

        第二、索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間。如果要建立聚簇索引,那麼需要的空間就會更大。 

        第三、當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。

什麼樣的欄位適合建立索引:

 索引是建立在資料庫表中的某些列的上面。因此,在建立索引的時候,應該仔細考慮在哪些列上可以建立索引,在哪些列上不能建立索引。

       一般來說,應該在這些列上建立索引,例如:

       第一、在經常需要搜尋的列上,可以加快搜索的速度; 

       第二、在作為主鍵的列上,強制該列的唯一性和組織表中資料的排列結構; 

       第三、在經常用在連線的列上,這些列主要是一些外來鍵,可以加快連線的速度; 

       第四、在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的; 

       第五、在經常需要排序的列上建立索引,因為索引已經排序,這樣查詢可以利用索引的排序,加快排序查詢時間; 

       第六、在經常使用在WHERE子句中的列上面建立索引,加快條件的判斷速度。

       建立索引,一般按照select的where條件來建立,比如: select的條件是where f1 and f2,那麼如果我們在欄位f1或欄位f2上簡歷索引是沒有用的,只有在欄位f1和f2上同時建立索引才有用等。

什麼樣的欄位不適合建立索引:

同樣,對於有些列不應該建立索引。一般來說,不應該建立索引的的這些列具有下列特點:

第一,對於那些在查詢中很少使用或者參考的列不應該建立索引。這是因為,既然這些列很少使用到,因此有索引或者無索引,

並不能提高查詢速度。相反,由於增加了索引,反而降低了系統的維護速度和增大了空間需求。 
       第二,對於那些只有很少資料值的列也不應該增加索引。這是因為,由於這些列的取值很少,例如人事表的性別列,

在查詢的結果中,結果集的資料行佔了表中資料行的很大比 例,即需要在表中搜索的資料行的比例很大。

增加索引,並不能明顯加快檢索速度。 
       第三,對於那些定義為text, image和bit資料型別的列不應該增加索引。這是因為,這些列的資料量要麼相當大,要麼取值很少。 
        第四,當修改效能遠遠大於檢索效能時,不應該建立索 引。這是因為,修改效能和檢索效能是互相矛盾的。

當增加索引時,會提高檢索效能,但是會降低修改效能。當減少索引時,會提高修改效能,降低檢索效能。

因此,當修改效能遠遠大於檢索效能時,不應該建立索引。


建立索引的方法::

1、建立索引,例如 create index <索引的名字> on table_name (列的列表); 
      2、修改表,例如 alter table table_name add index[索引的名字] (列的列表); 
      3、建立表的時候指定索引,例如create table table_name ( [...], INDEX [索引的名字] (列的列表) );

查看錶中索引的方法:

show index from table_name; 檢視索引

索引的型別及建立例子::

1.PRIMARY KEY (主鍵索引)

MySQL> alter table table_name add primary key ( `column` )

2.UNIQUE 或 UNIQUE KEY (唯一索引)

mysql> alter table table_name add unique (`column`)


     3.FULLTEXT (全文索引)
     mysql> alter table table_name add fulltext (`column` )

     4.INDEX (普通索引)
     mysql> alter table table_name add index index_name ( `column` )

5.多列索引 (聚簇索引)
      mysql> alter table `table_name` add index index_name ( `column1`, `column2`, `column3` )

1.選擇唯一性索引

唯一性索引的值是唯一的,可以更快速的通過該索引來確定某條記錄。例如,學生表中學號是具有唯一性的欄位。為該欄位建立唯一性索引可以很快的確定某個學生的資訊。如果使用姓名的話,可能存在同名現象,從而降低查詢速度。

2.為經常需要排序、分組和聯合操作的欄位建立索引

經常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的欄位,排序操作會浪費很多時間。如果為其建立索引,可以有效地避免排序操作。

3.為常作為查詢條件的欄位建立索引

如果某個欄位經常用來做查詢條件,那麼該欄位的查詢速度會影響整個表的查詢速度。因此,為這樣的欄位建立索引,可以提高整個表的查詢速度。

4.限制索引的數目

索引的數目不是越多越好。每個索引都需要佔用磁碟空間,索引越多,需要的磁碟空間就越大。修改表時,對索引的重構和更新很麻煩。越多的索引,會使更新表變得很浪費時間。

5.儘量使用資料量少的索引

如果索引的值很長,那麼查詢的速度會受到影響。例如,對一個CHAR(100)型別的欄位進行全文檢索需要的時間肯定要比對CHAR(10)型別的欄位需要的時間要多。

6.儘量使用字首來索引

如果索引欄位的值很長,最好使用值的字首來索引。例如,TEXT和BLOG型別的欄位,進行全文檢索會很浪費時間。如果只檢索欄位的前面的若干個字元,這樣可以提高檢索速度。

7.刪除不再使用或者很少使用的索引

表中的資料被大量更新,或者資料的使用方式被改變後,原有的一些索引可能不再需要。資料庫管理員應當定期找出這些索引,將它們刪除,從而減少索引對更新操作的影響。

8 . 最左字首匹配原則,非常重要的原則。

MySQL會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配,比如a 1=”” and=”” b=”2” c=”“> 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

9 .=和in可以亂序。

比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

10 . 儘量選擇區分度高的列作為索引。

區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別欄位可能在大資料面前區分度就 是0,那可能有人會問,這個比例有什麼經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的欄位我們都要求是0.1以上,即平均1條掃描10條 記錄

11 .索引列不能參與計算,保持列“乾淨”。

比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的欄位值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本 太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);

12 .儘量的擴充套件索引,不要新建索引。 
比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可

注意:選擇索引的最終目的是為了使查詢的速度變快。上面給出的原則是最基本的準則,但不能拘泥於上面的準則。讀者要在以後的學習和工作中進行不斷的實踐。根據應用的實際情況進行分析和判斷,選擇最合適的索引方式。


相關推薦

mysql 建議索引原因以及優缺點

建立索引的優缺點: 為什麼要建立索引呢?         這是因為,建立索引可以大大提高系統的效能。          第一、通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。          第二、可以大大加快 資料的檢索速度,這也是建立索引的最主要的原因

mysql主從延遲原因以及解決方案

MySQL資料庫主從同步延遲原理。 MySQL資料庫主從同步延遲是怎麼產生的。 MySQL資料庫主從同步延遲解決方案。 MySQL資料庫主從同步延遲產生的因素。 1.MySQL資料庫主從同步延遲原理。 答:談到MySQL資料庫主從同步延遲原理,得從mys

mysql資料庫建立索引mysql索引總結----mysql 索引型別以及建立;mysql_建立索引優缺點

因為欣賞所以轉載: http://www.cnblogs.com/cy163/archive/2008/10/27/1320798.html http://www.cnblogs.com/lihuiyong/p/5623191.html ht

MySQL數據備份 索引原理以及查詢優化

權限 示例 .cn 顯示 一個 物理 mysqld 恢復 cmd 補充 MySQL可視化(IDE)工具 我們之前對數據庫的操作都是通過cmd命令進行的比較繁瑣 那麽有沒有更漸變的方法去辦這個事呢? 答案事必須的 往下看吧。。。     navicat該工具是一

MySQL影響性能的因素原因以及性能優化配置詳解

產出 詳細 告訴 rbo 如果 進制 valid 操作符 最優 (https://blog.csdn.net/kangshuo2471781030/article/details/79315577) 一、MySQL性能優化之-影響性能的因素 1.商業需求的影響 不合

MySQL索引原理以及查詢優化

地址 存儲引擎 想要 方式 聯合 執行 圖書 解決 範圍查詢 一、介紹 1.什麽是索引? 一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些復雜的查詢操作,因此對查詢語句的優化顯然

MySQL存儲引擎以及索引原理

文件 按順序 添加 記錄 生成 有時 p地址 列名 問題 一、MySQL存儲引擎:MySQL將數據用各種不同的技術存儲在文件中,這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。這些不同的技術以及配套的相關功能在 mysql中

FULLTEXT的索引 原因是單詞 “MySQL” 出現在至少全文的50%的行中。 因此, 它被列入停止字。

MySQL支援全文索引和搜尋功能。MySQL中的全文索引型別FULLTEXT的索引。  FULLTEXT 索引僅可用於 MyISAM 表;他們可以從CHAR、VARCHAR或TEXT列中作為CREATE TABLE語句的一部分被建立,或是隨後使用ALTER TABLE 或 CREATE IN

建立索引後,速度變快原因?以及索引失效總結

總結自韓順平老師教學 速度變快是因為搜尋引擎的選擇,一般是Btree,二叉樹的話是logn的時間複雜度; 索引失效的總結。以下是具體描述。 原理示意圖:   .   索引使用的注意事項 索引的代價: 佔用磁碟空間 對dml

ElasticSearch教程——倒排索引及其資料結構以及優缺點

ElasticSearch彙總請檢視:ElasticSearch教程——彙總篇   倒排索引 Elasticsearch 使用一種稱為 倒排索引 的結構,它適用於快速的全文搜尋。一個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有一個包含它的文件列

MySQL定位慢查詢以及索引優化

(一)定位慢查詢 1.通過explain,可以檢視sql語句的執行情況(比如查詢的表,使用的索引以及mysql在表中找到所需行的方式等),一般情況下,基本可以通過explain,主要是通過其查詢行的方式和查詢行數確定問題,因為全表掃描很浪費時間,佔用cpu。 2.通過show pr

MySQL索引總結以及執行索引語句

例如:資料庫中2萬條記錄,如果要執行一個查詢,select  * from table where num =1000, 如果沒有建立索引,必須要遍歷整個表,直到num=1000被找到為止, 如果在num這個列上設定索引,就不需要任何的掃描,直接在索引裡面找到1000. 所以建

Mysql索引命令、優缺點、注意事項

建立表時簡歷索引 1、建表同時建立單索引 CREATE TABLE t_user1(id INT , userName VARCHAR(20), PASSWORD VARCHAR(20), INDEX (userName) #關鍵字INDEX ); 2、建表同時建立唯一索引(可以是單或多

mysql索引型別以及建立

文章歸屬:http://feiyan.info/16.html,我想自己去寫了,但是發現此君總結的非常詳細。直接搬過來了 關於MySQL索引的好處,如果正確合理設計並且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。對於沒有索引

詳解B+tree以及mysql索引原理 一

最近在學mysq的索引,網上查了很多資料但都沒有很好理解的,現在先講講b+tree 動態查詢樹主要有:二叉查詢樹(Binary Search Tree),平衡二叉查詢樹(Balanced Binary Search Tree),紅黑樹 (Red-Black Tree )

mysql佔用伺服器cpu過高的原因以及解決辦法

排查方法 : > mysql -uroot -p      #登陸資料庫 >********       &n

mysql索引總結----mysql 索引型別以及建立

文章歸屬:http://feiyan.info/16.html 關於MySQL索引的好處,如果正確合理設計並且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一個人力三輪車。對於沒有索引的表,單表查詢可能幾十萬資料就是瓶頸,而通

mysql索引型別以及適用場景

1.普通索引 最基本的索引,沒有任何限制 2.唯一索引 索引列的值必須唯一,但允許有空值 3.主鍵索引 主鍵索引屬於一種特殊的唯一索引,不允許有空值 4.單列索引

資料庫索引的實現原理以及優缺點

資料庫索引,在資料庫管理系統中是一個排序形式的資料結構,以協助快速查詢和更新資料庫表中資料。索引的實現通常使用B樹及其變種B+樹。 那麼為什麼要用B+樹來實現索引而不使用二叉搜尋樹或者平衡樹或者紅黑樹呢?要知道原因首先需要了解B樹的性質: 一個 m 階的B樹滿足以下條件:

mysql慢查詢原因分析與解決(三)——索引及查詢優化

索引的型別 Ø 普通索引:這是最基本的索引型別,沒唯一性之類的限制。 Ø 唯一性索引:和普通索引基本相同,但所有的索引列值保持唯一性。 Ø 主鍵:主鍵是一種唯一索引,但必須指定為”PRIMARY KEY”。 Ø 全文索引:MYSQL從3.23.23開始支援全