正確建立 使用索引

2021-10-10 04:56:09 字數 1234 閱讀 5497

集合可以預知是比較小的,不必要建立索引,因為全表掃瞄的非常快,不必要維護索引;

可預知每次查詢的結果集合佔比比較大時(30%以上,佔比越大索引速度越慢),就沒有必要建立索引,因為使用索引需要進行2次查詢(查詢條目和根據索引指標去查詢相應的文件)

正確選擇的文件字段建立索引,應該選擇字段值基數大的建立索引;例如"性別"字段值基數只有「男」和「女」,那麼建立索引的意義不大;

復合索引欄位的順序非常重要,應該將基數大的字段放在前面,這樣查詢時可以更精確定位目標結果集;

注意復合索引的排序方向選擇,在基於多條件查詢結果集進行排序時,索引方向對效率影響非常大;例如db.user.ensureindex()建立索引,當db.user.find(}).sort()查詢時需要對結果集在記憶體排序進行排序再返回;

對巢狀文件建立索引時,注意對巢狀文件本身和對巢狀文件的某個字段建立索引是不同的。

建立索引時,陣列欄位最多只能有乙個,因為對陣列建立索引實際上是對陣列中的每乙個元素建立索引,代價非常高;

對於某個索引的鍵,如果這個鍵在在某個文件中是乙個陣列,那這個索引就被標誌位多鍵索引,即使把這個欄位為陣列的文件刪掉了也不能變回非多鍵索引了;

正確建立隱式索引是避免在乙個集合建立過多索引的好方法,例如有乙個索引,實際上可以使用包含欄位a為字首的索引如等;

結果集需要排序時,必須注意索引的方向,避免結果集在記憶體中排序後在返回。當然這點在全表掃瞄和記憶體排序中衡量,如果查詢結果集很小,記憶體排序效率還是非常快的;

注意使用覆蓋索引提高查詢效率,這樣可以只查詢條目不必要再根據索引指標去查詢相應的文件了;

「$ where"和檢查乙個鍵是否存在的}是不能使用索引的,因為在索引中不存在的字段和null欄位的儲存方式是一樣的。

「$ ne」取反查詢使用索引不是很有效,因為經常幾乎得檢測所有索引條目,另外注意"$ nin"就總是進行全表掃瞄的;

在有復合索引時,多欄位查詢時應該將會用於精確匹配的字段放在前面(例如),將用於範圍匹配的字段放在後面;

應該盡量使用"$ in"查詢代替用"$ or",因為"$ or"可以對每個字句都是用索引,相當於執行2次查詢然後將結果集合並。

對於巢狀文件,如果是對巢狀文件本身建立的索引,那麼只有在進行與子文件字段順序完全匹配的子文件查詢時,查詢優化器才會使用巢狀文件本身建立的索引。

可以使用hint()強制查詢使用特定的索引,但是如果指定有誤反而會很影響查詢效率,慎重使用吧

SqlServer 正確使用索引

寫sql語句的時候很多時候會用到filter篩選掉一些記錄,sql對篩選條件簡稱 sarg search argument sarg 1 where amount 4000 and amount 6000 上面這句就是篩選條件 當然這裡不是說sqlserver的where子句,是說sqlserver...

正確的使用索引

1.查詢的條件字段不是索引字段,對哪乙個字段建立了索引,就用這個欄位做條件 2.建立索引的時候應該對區分度比較大的列進行建立 1 10以下的重複率比較適合建立索引 3.範圍 範圍越大越慢 範圍越小越快 like a 速度慢 like a 速度快 4.條件列參與計算 使用函式 速度慢 5.and 和 ...

如何正確的建立MySQL索引

1 較頻繁地作為查詢條件的字段 這個都知道。什麼是教頻繁呢?分析你執行的所有sql語句。最好將他們乙個個都列出來。然後分析,發現其中有些欄位在大部分的sql語句查詢時候都會用到,那麼就果斷為他建立索引。2 唯一性太差的字段不適合建立索引 什麼是唯一性太差的字段。如狀態字段 型別字段。那些只儲存固定幾...