索引是什么?
模式(schema)中的一個數據庫對象。
在數據庫中用來加速對表的查詢。
通過使用快速訪問方法確定定位數據,減少磁盤的I/O
與表獨立存放,但不能獨立存在,必須屬於某個表
由數據庫自動維護,表被刪除時,該表上的索引自動被刪除
索引的作用類似於書的目錄,幾乎沒有一本書沒有目錄,因此幾乎沒有一張表沒有索引。
自動:當在表上定義一個PRIMARY KEY 或者 UNIQUE 約束時,數據庫自動創建一個對應的索引。
手動:用戶可以創建索引以加速查詢。
創建一個索引:
手動創建一個索引:
CREATE INDEX index_tb_student_name ON tbl_student(stu_name)
上面索引的名字可以自己命名
使用索引(在where 之后加上索引,提高傳效率)
select * from tbl_student where stu_name=?
總之:
索引在經常查詢的字段上面建立索引。
利用index對查詢進行優化(index可以避免對表的一個全面掃描)
原理:
當以某個字段建立一個索引的時候,數據庫就會生成一個索引頁,當我們查詢數據時,Oracle會先查索引頁,這樣就能夠很快的查找到要找的記錄。
注意:
如果表的列很少,不適合建索引。
當執行過多次的insert,delete,update后,會出現索引碎片,影響查詢速度,我們應該對索引進行重組,其方法如下:
drop index index_name;
create index index_name on table(column)
其實,就是刪除掉索引,重新再建立索引。
拓展:
對於創建的多列索引,只要查詢條件使用了最左邊的列,索引一般就會使用。
對於使用like的查詢,查詢如果是 “%aaa” 不會使用到索引,‘aaa%’會使用到索引。
下列的表將不會使用索引:
1、如果條件中有or,即使其中有條件帶索引也不會使用。
2、對於多列索引,不是使用的第一部分,則不會使用索引。
3、like查詢是以%開頭
4、如果列類型是字符串,那一定要再條件中將數據使用引號引起來,否則不使用索引。(添加是,字符串必須“)
5、如果MySQL估計使用全表掃描比使用索引快,則不使用索引。
alter table account add index my_index(login,name)
//login就是最左邊的列,name就是右邊的列
如果表中有復合索引,索引作用在多列上,此時我們注意:對於創建的多列索引,只要查詢條件使用了最左邊的列,索引一般會被使用。
此時:
select * from account where name="timchen"
由於使用的是右側的列,此時索引是不會生效的,如何知道呢?
添加explain 此時possible_key的值是為空的。
但是當我們使用左側的列是,explain的值不為空。
轉載