在本教程中,您將學習如何在表上創(chuàng)建索引以提高數(shù)據(jù)庫性能。
索引是與表相關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu),它基于一個或多個列(索引鍵)中的值提供對表中行的快速訪問。
假設(shè)您的數(shù)據(jù)庫中有一個customers表,并且您想使用以下語句找出名字是以字母A開頭的所有客戶。
SELECT cust_id, cust_name, address FROM customers WHERE cust_name LIKE 'A%';
為了找到這樣的客戶,服務(wù)器必須在customers表中逐行掃描并檢查名字列的內(nèi)容。盡管對于只有幾行的表來說,它可以正常工作,但是請想象一下,如果該表包含一百萬行,那么回答查詢可能需要花費多長時間。在這種情況下,您可以通過將索引應(yīng)用于表來加快處理速度。
您可以使用以下CREATE INDEX語句創(chuàng)建索引:
CREATE INDEX index_name ON table_name (column_name);
例如,要在客戶表的name列上創(chuàng)建索引,可以使用:
CREATE INDEX cust_name_idx ON customers (cust_name);
默認情況下,索引將允許重復的條目并按升序?qū)l目進行排序。 要要求唯一索引條目,請在CREATE之后添加關(guān)鍵字UNIQUE,如下所示:
CREATE UNIQUE INDEX cust_name_idx ON customers (cust_name);
在MySQL中,您可以查看特定表上的可用索引,如下所示:
mysql> SHOW INDEXES FROM customers \G
提示:用\G代替分號(;)終止SQL語句。 如果結(jié)果對于當前窗口而言太寬,則垂直顯示結(jié)果而不是常規(guī)表格格式。
您還可以構(gòu)建跨多列的索引。例如,假設(shè)您在數(shù)據(jù)庫中已命名表的用戶具有列first_name和last_name,和您經(jīng)常訪問使用這些列,那么你可以建立在兩個列的索引在一起以提高性能的用戶的記錄,如下圖:
CREATE INDEX user_name_idx ON users (first_name, last_name);
提示:您可以將數(shù)據(jù)庫索引視為書籍的索引部分,以幫助您快速查找或定位書籍中的特定主題。
索引應(yīng)謹慎創(chuàng)建。因為每次在表中添加,更新或刪除行時,都必須修改該表上的所有索引。因此,擁有的索引越多,服務(wù)器需要執(zhí)行的工作就越多,這最終會導致性能降低。
以下是創(chuàng)建索引時可以遵循的一些基本準則:
為您經(jīng)常用來檢索數(shù)據(jù)的列創(chuàng)建索引。
不要為從未用作檢索鍵的列創(chuàng)建索引。
用于聯(lián)接以改善聯(lián)接性能的索引列。
避免包含太多NULL值的列。
同樣,小表不需要索引,因為在小表的情況下,服務(wù)器掃描表通常比先查看索引要快。
注意:創(chuàng)建表時,大多數(shù)數(shù)據(jù)庫系統(tǒng)(如MySQL,SQL Server等)都會自動為表PRIMARY KEY和UNIQUE列創(chuàng)建索引。
您可以使用以下語句刪除不再需要的索引。
DROP INDEX index_name ON table_name;
下面的語句將從customers表刪除索引cust_name_idx。
DROP INDEX cust_name_idx ON customers;
此外,如果刪除表,那么所有關(guān)聯(lián)的索引也會被刪除。
警告:刪除索引之前,您應(yīng)該進行核對刪除索引會造成的影響。作為一般經(jīng)驗法則,切勿盲目創(chuàng)建或刪除索引。