1. 程式人生 > >淺談資料庫索引的使用規則

淺談資料庫索引的使用規則

對各位兄弟的建議:有些論壇或者帖子,若果感覺自己要掌握這些知識點,最好試試,不要隨便轉帖,讓錯誤的東西誤導更多的人!!!

淺談資料庫索引主要包括如下幾個方面

  • 索引原則
  • 所謂的最左原則(重點)

 索引失效的條件

1、使用不等於操作符(<>, !=);

下面這種情況,即使在列dept_id有一個索引,查詢語句仍然執行一次全表掃描
select * from dept where staff_num <> 1000;
但是開發中的確需要這樣的查詢,難道沒有解決問題的辦法了嗎?
方法:select * from test_users where age>100 union all  select * from test_users where age<100

2、使用 LIKE ‘%T’ 進行模糊查詢

3、不要在 where 子句中的“=”左邊進行函式、算術運算或其他表示式運算

select * from test where round(id)=10

4、比較不匹配資料型別

  dept_id是一個varchar2型的欄位,在這個欄位上有索引,但是下面的語句會執行全表掃描。select * from dept where dept_id = 900198;這是因為 oracle 會自動把 where 子句轉換成 to_number(dept_id)=900198,相當於使用函式,這樣就限制了索引的使用。

5、Mysql(btree) is null走索引,oracle  is  null 不走




6、B-tree索引 is null不會走,is not null會走,點陣圖索引 is null,is not null 都會走(自己沒有試驗)

7、 建立複合索引,使用like 破壞複合索引,只有部分起作用;or會導致複合索引完全失效

oracle、mysql的最左原則:

1.聯合索引:使用or導致聯合索引失效;

 建立索引利用age 和address




2.最左原則:where 的執行是從右到左執行,使用聯合索引,把過濾量大的條件放到左邊

 mysql:複合索引,必須按照你建立的索引的順序(必須含有最左列):


 oracle:

版本10:複合索引,必須按照你建立的索引的順序(必須含有最左列)


版本11:複合索引,含有任何一個就可以