create index方式,用於建立表的時候
普通的索引的建立:
create index (自定義)索引名 on 資料表(字段);
復合索引的建立:
create index (自定義)索引名 on 資料表(字段,欄位....);
alter table方式,用於建表完成後新增索引
//普通索引
alter table (表名) add index index_name (字段,欄位....) ;
//唯一索引
alter table (表名) add unique (字段,欄位....) ;
//主鍵索引
alter table (表名) add primary key (字段,欄位....) ;
//全文索引
alter table (表名) add fulltext (字段,欄位....) ;
//主鍵索引
alter table (表名) add index index_name (字段,欄位....) ;
在查詢條件前使用explain命令可以檢視sql的執行計畫,如果是null,說明無索引。
①大多數情況下很正常,偶爾很慢
1、資料庫在重新整理髒頁,例如 redo log 寫滿了需要同步到磁碟。
2、執行的時候,遇到鎖,如表鎖、行鎖。
②這條 sql 語句一直執行的很慢(索引失效,或者沒有索引,資料庫選擇不走索引)
like 以%開頭,索引無效;當like字首沒有%,字尾有%時,索引有效。
or語句前後沒有同時使用索引。當or左右查詢字段只有乙個是索引,該索引失效,只有當or左右查詢欄位均為索引時,才會生效
組合索引,不是使用第一列索引,索引失效。
資料型別出現隱式轉化。如varchar不加單引號的話可能會自動轉換為int型,使索引無效,產生全表掃瞄。
在索引欄位上使用not,<>,!=。不等於操作符是永遠不會用到索引的,因此對它的處理只會產生全表掃瞄。 優化方法: key<>0 改為 key>0 or key<0。
對索引字段進行計算操作、欄位上使用函式(即是在左邊做了運算)。(索引為 emp(ename,empno,sal))。
當全表掃瞄速度比索引速度快時,mysql會使用全表掃瞄,此時索引失效。(主鍵索引和非主鍵索引是有區別的,主鍵索引存放的值是整行字段的資料,而非主鍵索引上存放的值不是整行字段的資料,而且存放主鍵欄位的值。
也就是說,我們如果走 非主鍵索引這個欄位的索引的話,最後會查詢到對應主鍵的值,然後,再根據主鍵的值走主鍵索引,查詢到整行資料返回。所以說走全表查詢要查詢n行,那索引就是2n,如果n很大,這個時候2n >>n,資料庫就會放棄索引走全表查詢)
所謂聚集索引,就是data域存放著資料,主鍵索引就屬於聚集索引。
非聚集索引是data存放著主鍵或資料的指標,二級索引就屬於非聚集索引。
如果我們要查詢的字段恰好建立了索引,那就不用「回表」再根據主鍵查一遍,直接返回值
例如:select name from table_a where name=『zrx』;;這時候我們恰好有為name欄位建立索引,我們就能得到name的值(因為索引的key本身就是name啊),系統難道還會去根據主鍵回表再查一遍嗎?答案是肯定不會的。
同樣地,
例如:select id from table_a where id=『10086』;這查詢也會出現索引覆蓋,因為主鍵索引的key同樣是id,資料庫就不會再去回表查詢一遍了。
這個覆蓋索引有點奇奇怪怪啊,根據乙個已經知道的值再查一遍。不過我猜想還是有作用的,應該在像右模糊查詢這種情況下。
1.查詢頻繁,修改不頻繁
2.經常作為條件查詢的
資料庫索引相關知識
查詢條件欄位和排序字段,新增聯合索引,查詢條件欄位在聯合索引的前面 整數型別比字元型別處理開銷更小 盡量避免null,應該指定列為 not null,使用乙個特殊的值 0,或者空值 來代替null 含有null的列很難進行查詢優化,建立索引的原則 1.對於查詢中很少涉及的列或者重複值比較多的列,不要...
資料庫知識 認識索引
注 該文作為學習資料,僅供參考!資料在磁碟上是以塊的形式儲存的。為確保對磁碟操作的原子性,訪問資料的時候會一併訪問所有資料塊。磁碟上的這些資料塊與鍊錶類似,即它們都包含一 個資料段和乙個指標,指標指向下乙個節點 資料塊 的記憶體位址,而且它們都不需要連續儲存 即邏輯上相鄰的資料塊在物理上可以相隔很遠...
資料庫索引基礎知識
索引是對資料表中的一列或多列的值進行排序的一種結構,使用索引可以快速訪問資料表中的特定資訊。索引的主要目的是加快檢索表中的資料,唯一索引 不允許任何兩行具有相同索引值的索引 主鍵索引 資料表中經常有一列或者多列組合,其值唯一標識表中的每一行 聚集索引 表中行的物理順序與鍵值的邏輯順序相同。乙個表中只...