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