經常在查詢中作為where條件的欄位,經常作為連表查詢的條件欄位都應該加索引,不論數據量多少,都應該事先加好索引
Ⅱ sql語句中什麼時候可以用索引什麼時候不可以用
樓上的說的正確:那我就給你個例子把---use students --<指定庫名>go/*--檢查資料庫是否存在索引(索引放在系統表中sysindexes中)--*/if exists(select name from sysindexes where name ='IX_stu_writtenexam') --<表名 --欄位>drop index stu .IX_stu_writtenexam --如果存在刪除索引gocreate nonclustered index ix_stu_writtenexam --創建非聚居索引 on stu(wriittenexam) with fillfactor =20 --填充因子go
Ⅲ sql哪些地方用到索引
你在一個欄位或者函數上建立了索引,你不需要刻意去探究怎麼去使用這個索引,這個索引是給資料庫系統用的,比如你在person表的id上建立了索引,你使用select * from person的時候系統就會自己去使用索引你會發現你返回結果的時間縮短了很多
Ⅳ sql 什麼時候用聚集索引和非聚集索引
1 聚集索引:該索引中鍵值的邏輯順序決定了表中相應行的物理順序。
聚集索引確定表中數據的物理順序。聚集索引類似於電話簿,後者按姓氏排列數據。由於聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。
2 聚集索引使用注意事項
定義聚集索引鍵時使用的列越少越好。
• 包含大量非重復值的列。
.• 使用下列運算符返回一個范圍值的查詢:BETWEEN、>、>=、< 和 <=。
• 被連續訪問的列。
• 回大型結果集的查詢。
• 經常被使用聯接或 GROUP BY 子句的查詢訪問的列;一般來說,這些是外鍵列。對 ORDER BY 或
GROUP BY 子句中指定的列進行索引,可以使 SQL Server 不必對數據進行排序,因為這些行已經排序。這樣可以提高查詢性能。
• OLTP 類型的應用程序,這些程序要求進行非常快速的單行查找(一般通過主鍵)。應在主鍵上創建聚集索引。
3 聚集索引不適用於:
• 頻繁更改的列 。這將導致整行移動(因為 SQL Server
必須按物理順序保留行中的數據值)。這一點要特別注意,因為在大數據量事務處理系統中數據是易失的。
• 寬鍵 。來自聚集索引的鍵值由所有非聚集索引作為查找鍵使用,因此存儲在每個非聚集索引的葉條目內。
4 非聚集索引:數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。
非聚集索引中的項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲(這可以由聚集索引規定)。對於非聚集索引,可以為在表非聚集索引中查找數據時常
用的每個列創建一個非聚集索引。有些書籍包含多個索引。例如,一本介紹園藝的書可能會包含一個植物通俗名稱索引,和一個植物學名索引
Ⅳ sql中索引有什麼用
索引用來提高讀取數據的速度。
比如你要從一個有一萬條記錄的表中讀取記錄,那麼如果有索引,他會通過索引定位,找到你要找的記錄,速度比一個一個記錄的掃描錶快很多很多倍。
表的某一個列可以建立索引,也可以是幾個列一起建立索引。
索引有主鍵索引、唯一性索引等。
主鍵的索引是默認的,不能刪除。
你可以先看看數據結構->排序,查找,B-Tree,red-black tree等內容。然後看看資料庫系統原理的一些基本概念,不用全看懂。然後下載MySQL資料庫,安裝,寫一些測試程序,往表裡寫個百八十萬條記錄,然後查詢。。。
Ⅵ mysql資料庫中什麼時候加索引
欄位添加索引的語句可以網路找 mysql 添加索引命令。
索引的好處在於可以講指定列進行排序,提高檢索的速度。
一個簡單的例子:
某個列的數據是
id name
12 小李
10 小龍
5 小青
99 小紅
id列創建索引後就會生成一個索引表
id index
5 3
10 2
12 1
99 4
當查詢 where id =10的 時候,使用到索引表。由於10下面是15,不可能有大於10的數。所以不再進行掃描表操作。返回第二條數據,對應回主表的第二行。
這樣就提高了查詢的速度,如果沒添加索引;則掃描整張主表。
索引的類型,什麼列需要加索引等相關信息的你還需網路查詢一下,這里告訴你的是一些基本的概念。
Ⅶ sql 什麼時候用聚集索引和非聚集索引
1
聚集索引:該索引中鍵值的邏輯順序決定了表中相應行的物理順序。
聚集索引確定表中數據的物理順序。聚集索引類似於電話簿,後者按姓氏排列數據。由於聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引。但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。
2
聚集索引使用注意事項
定義聚集索引鍵時使用的列越少越好。
•
包含大量非重復值的列。
.•
使用下列運算符返回一個范圍值的查詢:BETWEEN、>、>=、<
和
<=。
•
被連續訪問的列。
•
回大型結果集的查詢。
•
經常被使用聯接或
GROUP
BY
子句的查詢訪問的列;一般來說,這些是外鍵列。對
ORDER
BY
或
GROUP
BY
子句中指定的列進行索引,可以使
SQL
Server
不必對數據進行排序,因為這些行已經排序。這樣可以提高查詢性能。
•
OLTP
類型的應用程序,這些程序要求進行非常快速的單行查找(一般通過主鍵)。應在主鍵上創建聚集索引。
3
聚集索引不適用於:
•
頻繁更改的列
。這將導致整行移動(因為
SQL
Server
必須按物理順序保留行中的數據值)。這一點要特別注意,因為在大數據量事務處理系統中數據是易失的。
•
寬鍵
。來自聚集索引的鍵值由所有非聚集索引作為查找鍵使用,因此存儲在每個非聚集索引的葉條目內。
4
非聚集索引:數據存儲在一個地方,索引存儲在另一個地方,索引帶有指針指向數據的存儲位置。
非聚集索引中的項目按索引鍵值的順序存儲,而表中的信息按另一種順序存儲(這可以由聚集索引規定)。對於非聚集索引,可以為在表非聚集索引中查找數據時常
用的每個列創建一個非聚集索引。有些書籍包含多個索引。例如,一本介紹園藝的書可能會包含一個植物通俗名稱索引,和一個植物學名索引
Ⅷ 資料庫在什麼時候會用到索引
1) 基本正確,另外有些db軟體有高級用法,可以強制指定使用索引(查詢路徑)。。
2)不使用的話,自然沒必要訪問索引,因為再走索引就多此一舉了。
3)主鍵是索引。
Ⅸ 在SQL中怎樣用指定索引查詢
一般來說在條件中使用索引對應的第一個欄位就可能會用到該索引。
微軟的SQL SERVER提供了兩種索引:聚集索引(clustered index,也稱聚類索引、簇集索引)和非聚集索引(nonclustered index,也稱非聚類索引、非簇集索引)。
索引是資料庫中重要的數據結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用IBM最先提出的ISAM索引結構。
數據搜索實現角度
索引也是另外一類文件/記錄,它包含著可以指示出相關數據記錄的各種記錄。其中,每一索引都有一個相對應的搜索碼,字元段的任意一個子集都能夠形成一個搜索碼。這樣,索引就相當於所有數據目錄項的一個集合,它能為既定的搜索碼值的所有數據目錄項提供定位所需的各種有效支持。
以上內容參考:網路-資料庫索引
Ⅹ 分析SQL執行過程中,哪些SQL條件會走索引
這樣回答你,以下幾種情況sql中索引不會被用到
1、查詢謂詞沒有使用索引的主要邊界,換句話說就是select *,可能會導致不走索引。
比如,你查詢的是SELECT * FROM T WHERE Y=XXX;假如你的T表上有一個包含Y值的組合索引,但是優化器會認為需要一行行的掃描會更有效,這個時候,優化器可能會選擇TABLE ACCESS FULL,但是如果換成了SELECT Y FROM T WHERE Y = XXX,優化器會直接去索引中找到Y的值,因為從B樹中就可以找到相應的值。
2、單鍵值的b樹索引列上存在null值,導致COUNT(*)不能走索引。
如果在B樹索引中有一個空值,那麼查詢諸如SELECT COUNT(*) FROM T 的時候,因為HASHSET中不能存儲空值的,所以優化器不會走索引,有兩種方式可以讓索引有效,一種是SELECT COUNT(*) FROM T WHERE XXX IS NOT NULL或者把這個列的屬性改為not null (不能為空)。
3、索引列上有函數運算,導致不走索引
如果在T表上有一個索引Y,但是你的查詢語句是這樣子SELECT * FROM T WHERE FUN(Y) = XXX。這個時候索引也不會被用到,因為你要查詢的列中所有的行都需要被計算一遍,因此,如果要讓這種sql語句的效率提高的話,在這個表上建立一個基於函數的索引,比如CREATE INDEX IDX FUNT ON T(FUN(Y));這種方式,等於Oracle會建立一個存儲所有函數計算結果的值,再進行查詢的時候就不需要進行計算了,因為很多函數存在不同返回值,因此必須標明這個函數是有固定返回值的。
4、隱式轉換導致不走索引。
索引不適用於隱式轉換的情況,比如你的SELECT * FROM T WHERE Y = 5 在Y上面有一個索引,但是Y列是VARCHAR2的,那麼Oracle會將上面的5進行一個隱式的轉換,SELECT * FROM T WHERE TO_NUMBER(Y) = 5,這個時候也是有可能用不到索引的。
5、表的資料庫小或者需要選擇大部分數據,不走索引
在Oracle的初始化參數中,有一個參數是一次讀取的數據塊的數目,比如你的表只有幾個數據塊大小,而且可以被Oracle一次性抓取,那麼就沒有使用索引的必要了,因為抓取索引還需要去根據rowid從數據塊中獲取相應的元素值,因此在表特別小的情況下,索引沒有用到是情理當中的事情。
6、cbo優化器下統計信息不準確,導致不走索引
很長時間沒有做表分析,或者重新收集表狀態信息了,在數據字典中,表的統計信息是不準確的,這個情況下,可能會使用錯誤的索引,這個效率可能也是比較低的。
7、!=或者<>(不等於),可能導致不走索引,也可能走 INDEX FAST FULL SCAN
例如select id from test where id<>100
8、表欄位的屬性導致不走索引,字元型的索引列會導致優化器認為需要掃描索引大部分數據且聚簇因子很大,最終導致棄用索引掃描而改用全表掃描方式,
由於字元型和數值型的在insert的時候排序不同,字元類型導致了聚簇因子很大,原因是插入順序與排序順序不同。詳細點說,就是按照數字類型插入(1..3200000),按字元類型('1'...'32000000')t排序,在對字元類型使用大於運算符時,會導致優化器認為需要掃描索引大部分數據且聚簇因子很大,最終導致棄用索引掃描而改用全表掃描方式。