五 索引分類
直接創建索引和間接創建索引
直接創建索引 CREATE INDEX mycolumn_index ON mytable (myclumn)
間接創建索引 定義主鍵約束或者唯壹性鍵約束 可以間接創建索引
普通索引和唯壹性索引
普通索引 CREATE INDEX mycolumn_index ON mytable (myclumn)
唯壹性索引 保證在索引列中的全部數據是唯壹的 對聚簇索引和非聚簇索引都可以使用
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
單個索引和復合索引
單個索引 即非復合索引
復合索引 又叫組合索引 在索引建立語句中同時包含多個字段名 最多 個字段
CREATE INDEX name_index ON username(firstname lastname)
聚簇索引和非聚簇索引(聚集索引 群集索引)
聚簇索引 物理索引 與基表的物理順序相同 數據值的順序總是按照順序排列
CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH
ALLOW_DUP_ROW(允許有重復記錄的聚簇索引)
非聚簇索引 CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)
六 索引的使用
當字段數據更新頻率較低 查詢使用頻率較高並且存在大量重復值是建議使用聚簇索引
經常同時存取多列 且每列都含有重復值可考慮建立組合索引
復合索引的前導列壹定好控制好 否則無法起到索引的效果 如果查詢時前導列不在查詢條件中則該復合索引不會被使用 前導列壹定是使用最頻繁的列
多表操作在被實際執行前 查詢優化器會根據連接條件 列出幾組可能的連接方案並從中找出系統開銷最小的最佳方案 連接條件要充份考慮帶有索引的表 行數多的表;內外表的選擇可由公式 外層表中的匹配行數*內層表中每壹次查找的次數確定 乘積最小為最佳方案
where子句中對列的任何操作結果都是在sql運行時逐列計算得到的 因此它不得不進行表搜索 而沒有使用該列上面的索引;如果這些結果在查詢編譯時就能得到 那麽就可以被sql優化器優化 使用索引 避免表搜索(例 select * from record where substring(card_no )=
&& select * from record where card_no like % )任何對列的操作都將導致表掃描 它包括數據庫函數 計算表達式等等 查詢時要盡可能將操作移至等號右邊
where條件中的 in 在邏輯上相當於 or 所以語法分析器會將in ( ′ ′)轉化為column= ′ or column= ′來執行 我們期望它會根據每個or子句分別查找 再將結果相加 這樣可以利用column上的索引;但實際上它卻采用了 or策略 即先取出滿足每個or子句的行 存入臨時數據庫的工作表中 再建立唯壹索引以去掉重復行 最後從這個臨時表中計算結果 因此 實際過程沒有利用column上索引 並且完成時間還要受tempdb數據庫性能的影響 in or子句常會使用工作表 使索引失效;如果不產生大量重復值 可以考慮把子句拆開;拆開的子句中應該包含索引
要善於使用存儲過程 它使sql變得更加靈活和高效
lishixinzhi/Article/program/MySQL/201311/29603