索引是特殊的查找表,數(shù)據(jù)庫(kù)搜索引擎可以使用索引來(lái)加速數(shù)據(jù)檢索。簡(jiǎn)而言之,anindex是指向表中數(shù)據(jù)的指針。數(shù)據(jù)庫(kù)中的索引與書(shū)后的索引非常相似。
例如,如果要引用一本書(shū)中討論某個(gè)主題的所有頁(yè)面,則首先要參考索引,該索引按字母順序列出所有主題,然后引用一個(gè)或多個(gè)特定的頁(yè)碼。
索引有助于加快SELECT查詢(xún)和WHERE子句的速度,但它會(huì)通過(guò)UPDATE和INSERT語(yǔ)句減慢數(shù)據(jù)輸入速度??梢詣?chuàng)建或刪除索引,而不會(huì)影響數(shù)據(jù)。
創(chuàng)建索引涉及CREATE INDEX語(yǔ)句,該語(yǔ)句使您可以命名索引,指定表以及要索引的列或列,并指示索引是升序還是降序。
索引也可以是唯一的,類(lèi)似于UNIQUE約束,因?yàn)樗饕梢苑乐勾嬖谒饕牧谢蛄薪M合中的重復(fù)條目。
以下是的基本語(yǔ)法CREATE INDEX。
CREATE INDEX index_name ON table_name;
單列索引是僅基于一個(gè)表列創(chuàng)建的索引?;菊Z(yǔ)法如下-
CREATE INDEX index_nameON table_name (column_name);
唯一索引不僅用于提高性能,而且還用于數(shù)據(jù)完整性。唯一索引不允許將任何重復(fù)的值插入表中?;菊Z(yǔ)法如下-
CREATE UNIQUE INDEX index_nameon table_name (column_name);
復(fù)合索引是表的兩個(gè)或多個(gè)列上的索引?;菊Z(yǔ)法如下-
CREATE INDEX index_nameon table_name (column1, column2);
無(wú)論是創(chuàng)建單列索引還是復(fù)合索引,都要考慮column(s)到您可能在查詢(xún)的WHERE子句中非常頻繁地使用它作為過(guò)濾條件。
如果只使用一列,則應(yīng)選擇單列索引。如果WHERE子句中經(jīng)常使用兩個(gè)或更多列作為過(guò)濾器,則復(fù)合索引將是最佳選擇。
隱式索引是創(chuàng)建對(duì)象時(shí)由數(shù)據(jù)庫(kù)服務(wù)器自動(dòng)創(chuàng)建的索引。自動(dòng)為主鍵約束和唯一約束創(chuàng)建索引。
Example
以下是一個(gè)示例,我們將在COMPANY表中為薪水列創(chuàng)建索引-
sqlite> CREATE INDEX salary_index ON COMPANY (salary);
現(xiàn)在,讓我們使用以下.indices命令列出COMPANY表中所有可用的索引:
sqlite> .indices COMPANY
這將產(chǎn)生以下結(jié)果,其中sqlite_autoindex_COMPANY_1是隱式索引,該隱式索引是在創(chuàng)建表本身時(shí)創(chuàng)建的。
salary_indexsqlite_autoindex_COMPANY_1
您可以列出所有索引數(shù)據(jù)庫(kù)范圍,如下所示:
sqlite> SELECT * FROM sqlite_master WHERE type = 'index';
可以使用SQLite DROP命令刪除索引。刪除索引時(shí)應(yīng)小心,因?yàn)樾阅芸赡軙?huì)減慢或提高。
以下是基本語(yǔ)法如下-
DROP INDEX index_name;
您可以使用以下語(yǔ)句刪除以前創(chuàng)建的索引。
sqlite> DROP INDEX salary_index;
盡管索引旨在提高數(shù)據(jù)庫(kù)的性能,但有時(shí)應(yīng)避免使用它們。以下準(zhǔn)則指示何時(shí)應(yīng)重新考慮使用索引。
索引不得用于-
小表。
具有頻繁,大量批處理更新或插入操作的表。
包含大量NULL值的列。
經(jīng)常操作的列。