數據庫索引詳解

  • 索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。

如何選擇合適的列建立索引

  • 從where從句中,group by從句中,order by從句中,on從句中,select列中,還可以建立覆蓋索引(也就是指索引包含所有查詢的列,直接查索引就可以完成任務的)。
  • 索引字段越小越好,因為mysql存儲是以頁為單位的,如果從單頁中獲取更多的結果,減少IO操作,那麼就起到了積極的作用。
  • 離散程度越高的列放在聯合索引的前面,因為離散度越大的列可選擇性越高,可以通過count統計函數查看離散度 離散度: distinct 值越大,唯一值越多,它的離散度越高,可選擇性越高。

索引抑制

  • 索引抑制是指特定的關聯條件導致一些索引無法使用,從而導致SQL執行計劃效率較低。
  • 常見的5種索引抑制情況:
  1. 使用不等於運算符
  2. 使用IS NULL 或 IS NOT NULL
  3. 使用LIKE(不支持左模糊 like '%xx')
  4. 使用函數,如:TRUNC
  5. 關聯條件存在隱式轉換(不匹配的數據類型)

創建索引的語法

  • 創建一個普通的索引(一個最簡單的索引 沒有任何限制)
方式1: create index indexname on tableName(columnName(length));
方式2:alter tableName add index [indexName] on (columnName(length));
方式3: create table mytable(id int not null,username varchar(16) not null,
index [indexName](columnName(length)));
  • 刪除索引
drop index [indexName] on tableName;
  • 唯一索引(索引列的值必須唯一,但可以為null;如果是多個字段組合索引,那麼列值得組合唯一)
方式1:CREATE UNIQUE INDEX indexName ON tableName(columnName(length)) 
方式2:ALTER tableName ADD UNIQUE [indexName] ON (columnName(length)) 
方式3:CREATE TABLE tableName( ID INT NOT NULL, username VARCHAR(16) NOT    
            NULL, UNIQUE [indexName] (columnName(length)) );
  • 主鍵索引 : primary key