當前位置:首頁 » 編程語言 » sql索引樹高
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql索引樹高

發布時間: 2022-09-01 01:49:09

❶ mysql怎麼添加索引sql語句

工具:mysql資料庫創建一個user的表裡邊的欄位
1.普通索引 添加INDEX
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

下面演示下給user表的name欄位添加一個索引

2.主鍵索引 添加PRIMARY KEY
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

3.唯一索引 添加UNIQUE
ALTER TABLE `table_name` ADD UNIQUE ( `column` )

4.全文索引 添加FULLTEXT
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)

5.如何添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

❷ 索引為什麼能夠提高SQL的查詢速度

從數據來講,索引提高查詢速率我覺得是有兩個方面:一是通過減少I/O,降低db_block訪問量,加快數據存取效率從來來加快sql執行效率。第二呢,有些索引會對數據進行物理排序等操作,犧牲少量維護空間的代價來有效減少查詢時的計算量。從結構來看,樹形的查詢也是比線行的查詢效率要高效。

❸ SQL中創建索引的"索引"是什麼意思啊

索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式保存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜索條件的列上已經創建了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查找記錄至少要比順序掃描記錄快100倍。 假設我們創建了一個名為people的表: CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL ); 然後,我們完全隨機把1000個不同name值插入到people表。下圖顯示了people表所在數據文件的一小部分: 可以看到,在數據文件中name列沒有任何明確的次序。如果我們創建了name列的索引,MySQL將在索引中排序name列: 對於索引中的每一項,MySQL在內部為它保存一個數據文件中實際記錄所在位置的「指針」。因此,如果我們要查找name等於「Mike」記錄的peopleid(SQL命令為「SELECT peopleid FROM people WHERE name='Mike';」),MySQL能夠在name的索引中查找「Mike」值,然後直接轉到數據文件中相應的行,准確地返回該行的peopleid(999)。在這個過程中,MySQL只需處理一個行就可以返回結果。如果沒有「name」列的索引,MySQL要掃描數據文件中的所有記錄,即1000個記錄!顯然,需要MySQL處理的記錄數量越少,則它完成任務的速度就越快。

滿意請採納

❹ 遞歸SQL語句、索引的HEIGHT和BLEVEL以及SELECT FOR UPDATE相關問題

1,所謂的遞歸sql就是在運行當前的sql時調用另外一個sql,如果另外一個sql又調用了另一個sql,那麼遞歸深度就是1(從0開始)。

2,unique scan一般出現在掃描具有unique約束的索引列上:

scott@ORCL>select * from emp where empno=7788;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7788 TEST ANALYST 7566 09-12月-83 10000 20

執行計劃
----------------------------------------------------------
Plan hash value: 1181765974

---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 37 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMP | 1 | 37 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | EMP_EMPNO_IDX | 1 | | 0 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

因為CBO知道這個索引是唯一的,所以確定在掃描時只會返回一個rowid。

而range scan一般是掃描非唯一索引時,原理同上,不再贅述。

3,scott@ORCL>analyze index emp_empno_idx validate structure;

索引已分析

scott@ORCL>select HEIGHT from index_stats;

HEIGHT
----------
1

scott@ORCL>select blevel from user_indexes where index_name='EMP_EMPNO_IDX';

BLEVEL
----------
0

另外平衡樹的索引結構如下:

1
/\
/ \
2 3
/ \
4 5

height也就是索引的高度,這里是3。

而blevel指的是從根遍歷到當前塊要走的路徑長度,比如:2,3的blevel為1;4,5的為2,根本身的blevel為0

而在user_indexes中的blevel欄位值正是上面值的最大值,通常等於樹的高度,即height值:

下面是實例說明:

scott@ORCL>create table test as select * from sys.SOURCE$;

表已創建。

scott@ORCL>desc test
名稱
-----------------------------------------------------------------------------------------------------

OBJ#
LINE
SOURCE

scott@ORCL>create index test_idx on test(obj#);

索引已創建。

scott@ORCL>analyze index test_idx validate structure;

索引已分析

scott@ORCL>select blevel from all_indexes where lower(index_name)='test_idx';

BLEVEL
----------
2

4,當然可行,因為這時其它行是沒有被鎖定的。
scott@ORCL>select * from emp where deptno=10 for update;

sys@ORCL>delete from scott.emp where deptno!=10;

已刪除11行。

其實有的問題只要自己動手實踐一下就行了,另外樹高度為三級的索引是非常罕見的,除非你的表是非常的巨大。

❺ 如何利用索引提高SQLServer數據處理的效率

在良好的資料庫設計基礎上,能有效地使用索引是SQL Server取得高性能的基礎,SQL Server採用基於代價的優化模型,它對每一個提交的有關表的查詢,決定是否使用索引或用哪一個索引。因為查詢執行的大部分開銷是磁碟I/O,使用索引提高性能的一個主要目標是避免全表掃描,因為全表掃描需要從磁碟上讀表的每一個數據頁,如果有索引指向數據值,則查詢只需讀幾次磁碟就可以了。
所以如果建立了合理的索引,優化器就能利用索引加速數據的查詢過程。但是,索引並不總是提高系統的性能,在增、刪、改操作中索引的存在會增加一定的工作量,因此,在適當的地方增加適當的索引並從不合理的地方刪除次優的索引,將有助於優化那些性能較差的SQL Server應用。實踐表明,合理的索引設計是建立在對各種查詢的分析和預測上的,只有正確地使索引與程序結合起來,才能產生最佳的優化方案。本文就SQL Server索引的性能問題進行了一些分析和實踐。
一、聚簇索引(clustered indexes)的使用
聚簇索引是一種對磁碟上實際數據重新組織以按指定的一個或多個列的值排序。由於聚簇索引的索引頁面指針指向數據頁面,所以使用聚簇索引查找數據幾乎總是比使用非聚簇索引快。每張表只能建一個聚簇索引,並且建聚簇索引需要至少相當該表120%的附加空間,以存放該表的副本和索引中間頁。建立聚簇索引的思想是:
1、大多數表都應該有聚簇索引或使用分區來降低對表尾頁的競爭,在一個高事務的環境中,對最後一頁的封鎖嚴重影響系統的吞吐量。
2、在聚簇索引下,數據在物理上按順序排在數據頁上,重復值也排在一起,因而在那些包含范圍檢查(between、<、<=、>、>=)或使用group by或order by的查詢時,一旦找到具有范圍中第一個鍵值的行,具有後續索引值的行保證物理上毗連在一起而不必進一步搜索,避免了大范圍掃描,可以大大提高查詢速度。
3、在一個頻繁發生插入操作的表上建立聚簇索引時,不要建在具有單調上升值的列(如IDENTITY)上,否則會經常引起封鎖沖突。
4、在聚簇索引中不要包含經常修改的列,因為碼值修改後,數據行必須移動到新的位置。
5、選擇聚簇索引應基於where子句和連接操作的類型。
聚簇索引的侯選列是:
1、主鍵列,該列在where子句中使用並且插入是隨機的。
2、按范圍存取的列,如pri_order > 100 and pri_order < 200。
3、在group by或order by中使用的列。
4、不經常修改的列。
5、在連接操作中使用的列。
二、非聚簇索引(nonclustered indexes)的使用
SQL Server預設情況下建立的索引是非聚簇索引,由於非聚簇索引不重新組織表中的數據,而是對每一行存儲索引列值並用一個指針指向數據所在的頁面。換句話說非聚簇索引具有在索引結構和數據本身之間的一個額外級。一個表如果沒有聚簇索引時,可有250個非聚簇索引。每個非聚簇索引提供訪問數據的不同排序順序。在建立非聚簇索引時,要權衡索引對查詢速度的加快與降低修改速度之間的利弊。另外,還要考慮這些問題:
1、索引需要使用多少空間。
2、合適的列是否穩定。
3、索引鍵是如何選擇的,掃描效果是否更佳。
4、是否有許多重復值。
對更新頻繁的表來說,表上的非聚簇索引比聚簇索引和根本沒有索引需要更多的額外開銷。對移到新頁的每一行而言,指向該數據的每個非聚簇索引的頁級行也必須更新,有時可能還需要索引頁的分理。從一個頁面刪除數據的進程也會有類似的開銷,另外,刪除進程還必須把數據移到頁面上部,以保證數據的連續性。所以,建立非聚簇索引要非常慎重。非聚簇索引常被用在以下情況:
1、某列常用於集合函數(如Sum,....)。
2、某列常用於join,order by,group by。
3、查尋出的數據不超過表中數據量的20%。
三、覆蓋索引(covering indexes)的使用
覆蓋索引是指那些索引項中包含查尋所需要的全部信息的非聚簇索引,這種索引之所以比較快也正是因為索引頁中包含了查尋所必須的數據,不需去訪問數據頁。如果非聚簇索引中包含結果數據,那麼它的查詢速度將快於聚簇索引。
但是由於覆蓋索引的索引項比較多,要佔用比較大的空間。而且update操作會引起索引值改變。所以如果潛在的覆蓋查詢並不常用或不太關鍵,則覆蓋索引的增加反而會降低性能。
四、索引的選擇技術
p_detail是住房公積金管理系統中記錄個人明細的表,有890000行,觀察在不同索引下的查詢運行效果,測試在C/S環境下進行,客戶機是IBM PII350(內存64M),伺服器是DEC Alpha1000A(內存128M),資料庫為SYBASE11.0.3。
1、 select count(*) from p_detail where
op_date>』19990101』 and op_date<』
19991231』 and pri_surplus1>300
2、 select count(*),sum(pri_surplus1) from p_detail
where op_date>』19990101』 and
pay_month between『199908』 and』199912』
不建任何索引查詢1 1分15秒
查詢2 1分7秒
在op_date上建非聚簇索引查詢1 57秒
查詢2 57秒
在op_date上建聚簇索引查詢1 <1秒
查詢2 52秒
在pay_month、op_date、pri_surplus1上建索引查詢1 34秒
查詢2 <1秒
在op_date、pay_month、pri_surplus1上建索引查詢1 <1秒
查詢2 <1秒
從以上查詢效果分析,索引的有無,建立方式的不同將會導致不同的查詢效果,選擇什麼樣的索引基於用戶對數據的查詢條件,這些條件體現於where從句和join表達式中。一般來說建立索引的思路是:
(1)主鍵時常作為where子句的條件,應在表的主鍵列上建立聚簇索引,尤其當經常用它作為連接的時候。
(2)有大量重復值且經常有范圍查詢和排序、分組發生的列,或者非常頻繁地被訪問的列,可考慮建立聚簇索引。
(3)經常同時存取多列,且每列都含有重復值可考慮建立復合索引來覆蓋一個或一組查詢,並把查詢引用最頻繁的列作為前導列,如果可能盡量使關鍵查詢形成覆蓋查詢。
(4)如果知道索引鍵的所有值都是唯一的,那麼確保把索引定義成唯一索引。
(5)在一個經常做插入操作的表上建索引時,使用fillfactor(填充因子)來減少頁分裂,同時提高並發度降低死鎖的發生。如果在只讀表上建索引,則可以把fillfactor置為100。
(6)在選擇索引鍵時,設法選擇那些採用小數據類型的列作為鍵以使每個索引頁能夠容納盡可能多的索引鍵和指針,通過這種方式,可使一個查詢必須遍歷的索引頁面降到最小。此外,盡可能地使用整數為鍵值,因為它能夠提供比任何數據類型都快的訪問速度。
五、索引的維護
上面講到,某些不合適的索引影響到SQL Server的性能,隨著應用系統的運行,數據不斷地發生變化,當數據變化達到某一個程度時將會影響到索引的使用。這時需要用戶自己來維護索引。索引的維護包括:
1、重建索引
隨著數據行的插入、刪除和數據頁的分裂,有些索引頁可能只包含幾頁數據,另外應用在執行大塊I/O的時候,重建非聚簇索引可以降低分片,維護大塊I/O的效率。重建索引實際上是重新組織B-樹空間。在下面情況下需要重建索引:
(1)數據和使用模式大幅度變化。
(2)排序的順序發生改變。
(3)要進行大量插入操作或已經完成。
(4)使用大塊I/O的查詢的磁碟讀次數比預料的要多。
(5)由於大量數據修改,使得數據頁和索引頁沒有充分使用而導致空間的使用超出估算。
(6)dbcc檢查出索引有問題。
當重建聚簇索引時,這張表的所有非聚簇索引將被重建。
2、索引統計信息的更新
當在一個包含數據的表上創建索引的時候,SQL Server會創建分布數據頁來存放有關索引的兩種統計信息:分布表和密度表。優化器利用這個頁來判斷該索引對某個特定查詢是否有用。但這個統計信息並不動態地重新計算。這意味著,當表的數據改變之後,統計信息有可能是過時的,從而影響優化器追求最有工作的目標。因此,在下面情況下應該運行update statistics命令:
(1)數據行的插入和刪除修改了數據的分布。
(2)對用truncate table刪除數據的表上增加數據行。
(3)修改索引列的值。
六、結束語
實踐表明,不恰當的索引不但於事無補,反而會降低系統的執行性能。因為大量的索引在插入、修改和刪除操作時比沒有索引花費更多的系統時間。例如下面情況下建立的索引是不恰當的:
1、在查詢中很少或從不引用的列不會受益於索引,因為索引很少或從來不必搜索基於這些列的行。
2、只有兩個或三個值的列,如男性和女性(是或否),從不會從索引中得到好處。
另外,鑒於索引加快了查詢速度,但減慢了數據更新速度的特點。可通過在一個段上建表,而在另一個段上建其非聚簇索引,而這兩段分別在單獨的物理設備上來改善操作性能。

❻ 如何突破SQL Server索引列數的限制

這里說的聚集索引是聚簇索引吧。。。 聚簇索引即建立在聚簇上的索引,創建聚簇索引時,需要對已有表數據重新進行排序(若表中已有數據),即刪除原始的表數據後再將排序結果按物理順序插回,故聚簇索引建立完畢後,建立聚簇索引的列中的數據已經全部按序排列。 一個表中只能包含一個聚簇索引,但該索引可以包含多個列。 B-樹索引中,聚簇索引的葉層就是數據頁。 非聚簇索引類似書本索引,索引與數據存放在不同的物理區域,建立非聚簇索引時數據本身不進行排序。一個表中科含多個非聚簇索引。 B-樹索引中,非聚簇索引的葉層仍是索引頁,其以指針指向數據頁實際存儲位置。 唯一性索引保證表中沒有兩行在定義索引的列上具有重復值,ORACLE自動為主鍵和唯一鍵列創建唯一索引;主鍵本身就是唯一索引,反之不成立(唯一索引允許一個NULL值),唯一性索引比非唯一性索引效率高,故在一般情況下,在無重復值的列上應盡量建立唯一性索引。 若為謀個表的某個列創建了唯一索引,則即使這個列沒有唯一值約束,也會被強制限制不能插入重復記錄。 這樣回答LZ滿意么?

❼ SQL如何建立高效能索引

欄位1上應該是有默認的索引的,這樣的話簡單的看應該在欄位4上創建索引,來提高查詢和刪除的效率,但具體的需要看的查詢類型,比如你要是等值查詢,可以用B+樹索引或HASH索引,而如果查詢是范圍查詢則只能是B+樹索引,HASH索引不支持范圍查詢.此外,如果是LIKE查詢,則可能使用不了查詢,因為現在還沒有索引能夠支持統配符.
再有就是你的查詢選擇度是什麼情況, 如果欄位4上有索引,再在欄位2上建索引的查詢效率可能不確定

❽ SQL,索引的例子

就用 mysql 資料庫舉例吧

一、什麼是索引?

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

假設我們創建了一個名為people的表:

CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );

然後,我們完全隨機把1000個不同name值插入到people表。下圖顯示了people表所在數據文件的一小部分:

可以看到,在數據文件中name列沒有任何明確的次序。如果我們創建了name列的索引,MySQL將在索引中排序name列:

對於索引中的每一項,MySQL在內部為它保存一個數據文件中實際記錄所在位置的「指針」。因此,如果我們要查找name等於「Mike」記錄的peopleid(SQL命令為「SELECT peopleid FROM people WHERE name=\'Mike\';」),MySQL能夠在name的索引中查找「Mike」值,然後直接轉到數據文件中相應的行,准確地返回該行的peopleid(999)。在這個過程中,MySQL只需處理一個行就可以返回結果。如果沒有「name」列的索引,MySQL要掃描數據文件中的所有記錄,即1000個記錄!顯然,需要MySQL處理的記錄數量越少,則它完成任務的速度就越快。

二、索引的類型

MySQL提供多種索引類型供選擇:

普通索引

這是最基本的索引類型,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式創建:

創建索引,例如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從3.23.23版開始支持全文索引和全文檢索。在MySQL中,全文索引的索引類型為FULLTEXT。全文索引可以在VARCHAR或者TEXT類型的列上創建。它可以通過CREATE TABLE命令創建,也可以通過ALTER TABLE或CREATE INDEX命令創建。對於大規模的數據集,通過ALTER TABLE(或者CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快。本文下面的討論不再涉及全文索引,要了解更多信息,請參見MySQL documentation。

三、單列索引與多列索引

索引可以是單列索引,也可以是多列索引。下面我們通過具體的例子來說明這兩種索引的區別。假設有這樣一個people表:

ALTER TABLE people ADD INDEX fname_lname_age (firstname,lastname,age);

由於索引文件以B-樹格式保存,MySQL能夠立即轉到合適的firstname,然後再轉到合適的lastname,最後轉到合適的age。在沒有掃描數據文件任何一個記錄的情況下,MySQL就正確地找出了搜索的目標記錄!

那麼,如果在firstname、lastname、age這三個列上分別創建單列索引,效果是否和創建一個firstname、lastname、age的多列索引一樣呢?答案是否定的,兩者完全不同。當我們執行查詢的時候,MySQL只能使用一個索引。如果你有三個單列的索引,MySQL會試圖選擇一個限制最嚴格的索引。但是,即使是限制最嚴格的單列索引,它的限制能力也肯定遠遠低於firstname、lastname、age這三個列上的多列索引。

四、最左前綴

多列索引還有另外一個優點,它通過稱為最左前綴(Leftmost Prefixing)的概念體現出來。繼續考慮前面的例子,現在我們有一個firstname、lastname、age列上的多列索引,我們稱這個索引為fname_lname_age。當搜索條件是以下各種列的組合時,MySQL將使用fname_lname_age索引:

firstname,lastname,age
firstname,lastname
firstname
從另一方面理解,它相當於我們創建了(firstname,lastname,age)、(firstname,lastname)以及(firstname)這些列組合上的索引。下面這些查詢都能夠使用這個fname_lname_age索引:

table type possible_keys key key_len ref rows Extra people ref fname_lname_age fname_lname_age 102 const,const,const 1 Where used
下面我們就來看看這個EXPLAIN分析結果的含義。

table:這是表的名字。

type:連接操作的類型。下面是MySQL文檔關於ref連接類型的說明:

「對於每一種與另一個表中記錄的組合,MySQL將從當前的表讀取所有帶有匹配索引值的記錄。如果連接操作只使用鍵的最左前綴,或者如果鍵不是UNIQUE或PRIMARY KEY類型(換句話說,如果連接操作不能根據鍵值選擇出唯一行),則MySQL使用ref連接類型。如果連接操作所用的鍵只匹配少量的記錄,則ref是一種好的連接類型。」

在本例中,由於索引不是UNIQUE類型,ref是我們能夠得到的最好連接類型。

如果EXPLAIN顯示連接類型是「ALL」,而且你並不想從表裡面選擇出大多數記錄,那麼MySQL的操作效率將非常低,因為它要掃描整個表。你可以加入更多的索引來解決這個問題。預知更多信息,請參見MySQL的手冊說明。

possible_keys:

可能可以利用的索引的名字。這里的索引名字是創建索引時指定的索引昵稱;如果索引沒有昵稱,則默認顯示的是索引中第一個列的名字(在本例中,它是「firstname」)。默認索引名字的含義往往不是很明顯。

Key:

它顯示了MySQL實際使用的索引的名字。如果它為空(或NULL),則MySQL不使用索引。

key_len:

索引中被使用部分的長度,以位元組計。在本例中,key_len是102,其中firstname佔50位元組,lastname佔50位元組,age佔2位元組。如果MySQL只使用索引中的firstname部分,則key_len將是50。

ref:

它顯示的是列的名字(或單詞「const」),MySQL將根據這些列來選擇行。在本例中,MySQL根據三個常量選擇行。

rows:

MySQL所認為的它在找到正確的結果之前必須掃描的記錄數。顯然,這里最理想的數字就是1。

Extra:

這里可能出現許多不同的選項,其中大多數將對查詢產生負面影響。在本例中,MySQL只是提醒我們它將用WHERE子句限制搜索結果集。

七、索引的缺點

到目前為止,我們討論的都是索引的優點。事實上,索引也是有缺點的。

首先,索引要佔用磁碟空間。通常情況下,這個問題不是很突出。但是,如果你創建每一種可能列組合的索引,索引文件體積的增長速度將遠遠超過數據文件。如果你有一個很大的表,索引文件的大小可能達到操作系統允許的最大文件限制。

第二,對於需要寫入數據的操作,比如DELETE、UPDATE以及INSERT操作,索引會降低它們的速度。這是因為MySQL不僅要把改動數據寫入數據文件,而且它還要把這些改動寫入索引文件。

【結束語】

在大型資料庫中,索引是提高速度的一個關鍵因素。不管表的結構是多麼簡單,一次500000行的表掃描操作無論如何不會快。如果你的網站上也有這種大規模的表,那麼你確實應該花些時間去分析可以採用哪些索引,並考慮是否可以改寫查詢以優化應用。要了解更多信息,請參見MySQL manual。另外注意,本文假定你所使用的MySQL是3.23版,部分查詢不能在3.22版MySQL上執行。

❾ MySQL最多可建立多少索引和索引的限制

MySQL索引類型包括:
一、普通索引
這是最基本的索引,它沒有任何限制。有以下幾種創建方式:
1.創建索引
代碼如下:

CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR類型,length可以小於欄位實際長度;如果是BLOB和TEXT類型,必須指定 length,下同。

2.修改表結構

代碼如下:
ALTER mytable ADD INDEX [indexName] ON (username(length)) -- 創建表的時候直接指定。
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );

-- 刪除索引的語法:
DROP INDEX [indexName] ON mytable;

二、唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式:

代碼如下:
CREATE UNIQUE INDEX indexName ON mytable(username(length))
-- 修改表結構
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
-- 創建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );

三、主鍵索引
它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時創建主鍵索引:

代碼如下:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );

當然也可以用 ALTER 命令。記住:一個表只能有一個主鍵。
四、組合索引
為了形象地對比單列索引和組合索引,為表添加多個欄位:

代碼如下:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );

為了進一步榨取MySQL的效率,就要考慮建立組合索引。
二:使用索引的注意事項
使用索引時,有以下一些技巧和注意事項:
1.索引不會包含有NULL值的列
只要列中包含有NULL值都將不會被包含在索引中,復合索引中只要有一列含有NULL值,那麼這一列對於此復合索引就是無效的。所以我們在資料庫設計時不要讓欄位的默認值為NULL。
2.使用短索引
對串列進行索引,如果可能應該指定一個前綴長度。例如,如果有一個CHAR(255)的列,如果在前10個或20個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和I/O操作。
3.索引列排序
MySQL查詢只使用一個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫默認排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列創建復合索引。
4.like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是一個問題。like 「%aaa%」 不會使用索引而like 「aaa%」可以使用索引。
5.不要在列上進行運算

select * from users where YEAR(adddate)<2007;
將在每個行上進行運算,這將導致索引失效而進行全表掃描,因此我們可以改成:

select * from users where adddate<『2007-01-01';

6.不使用NOT IN和<>操作。

三:sql優化原則
常見的簡化規則如下:
1.不要有超過5個以上的表連接(JOIN)
2.考慮使用臨時表或表變數存放中間結果。
3.少用子查詢
4.視圖嵌套不要過深,一般視圖嵌套不要超過2個為宜。
5.連接的表越多,其編譯的時間和連接的開銷也越大,性能越不好控制。
6.最好是把連接拆開成較小的幾個部分逐個順序執行。
7.優先執行那些能夠大量減少結果的連接。
8.拆分的好處不僅僅是減少SQL Server優化的時間,更使得SQL語句能夠以你可以預測的方式和順序執行。

如果一定需要連接很多表才能得到數據,那麼很可能意味著設計上的缺陷。