MySQL之索引

來源:互聯網
上載者:User

標籤:blog   ar   使用   sp   on   檔案   資料   div   log   

1.什麼是資料庫索引

  索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式儲存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引尋找記錄至少要比順序掃描記錄快100倍。

2.索引的類型

  一、普通索引:這是最基本的索引類型,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式建立,
      建立索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
      修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
      建立表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );

  二、唯一性索引:這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式建立,
      建立索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
      修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
      建立表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );

  三、主鍵索引:主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。如果你曾經用過AUTO_INCREMENT類型的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在創      建表的時候指定,例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE                  tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。

  四、全文索引:在MySQL中,全文索引的索引類型為FULLTEXT。全文索引可以在VARCHAR或者TEXT類型的列上建立。它可以通過CREATE TABLE命令建立,也可以通過      ALTER TABLE或CREATE INDEX命令建立。對於大規模的資料集,通過ALTER TABLE(或者CREATE INDEX)命令建立全文索引要比把記錄插入帶有全文索引的空表更          快。 

  五、單列索引與多列索引:索引可以是單列索引,也可以是多列索引。

3.如何選擇合適的列建立索引

  一、where、group by、order by、on從句中出現的

  二、索引欄位越小越好

  三、建立聯合索引的時候,需要考慮離散度打的列放到聯合索引前面(離散度就是指取值的範圍大小)

4.索引的維護與最佳化(重複以及冗餘索引)

  一、定義:

    重複索引是指相同的列以相同的順序建立相同類型的索引。

    冗餘索引是指多個索引的首碼列相同,或是在聯合索引中使用了主鍵的索引。

  二、查看是否含有冗餘或者重複索引SQL(也可以使用命令列工具pt_duplicate_key_checker)

  

mysql> select a.table_schema  as ‘???‘,a.table_name as ‘??‘,a.index_name as ‘??1‘,b.index_name as ‘??2‘    -> ,a.column_name as ‘?????‘ from statistics a join statistics b on a.table_schema =b.table_schema    -> and  a.table_name = b.table_name and a.seq_in_index = b.seq_in_index and a.column_name = b.column_name    -> where a.seq_in_index = 1 and  a.index_name<>b.index_name;Empty set (0.48 sec)

  我的資料庫表結構中沒有重複或者是冗餘的索引的。

  三、刪除無用的索引

5.其他

    如果不能避免,你應該查看每張要結合起來的表,並且使用以上的策略來建立索引,然後再用EXPLAIN命令驗證一下是否使用了你料想中的索引。如果是的話,就OK。不是的話,你可能要建立臨時的表來將他們結合在一起,並且使用適當的索引。 要注意的是,建立太多的索引將會影響更新和插入的速度,因為它需要同樣更新每個索引檔案。對於一個經常需要更新和插入的表格,就沒有必要為一個很少使用的where字句單獨建立索引了,對於比較小的表,排序的開銷不會很大,也沒有必要建立另外的索引。

  

MySQL之索引

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.