一、索引——加快數據庫查詢速度
1)創建索引
1)CREATE INDEX
CREATE INDEX可對錶增加普通索引或UNIQUE索引
Creat [UNIQUE] | [BITMAP] INDEX index_name
On Table_name(column_x[ASC | DESC],column_y,…………)
eg:Creat Index index1 on table1 (column1)
–UNIQUE 唯一索引 BITMAP 位圖索引
–ASC升序(缺省值) DESC降序
2)Alter table
也可以使用Alter table 語句進行索引的創建
ALTER TABLE用來創建普通索引、UNIQUE索引或PRIMARY KEY索引。
ALTER TABLE table_name ADD INDEX index_name (column_list)
ALTER TABLE table_name ADD UNIQUE (column_list)
ALTER TABLE table_name ADD PRIMARY KEY (column_list)
創建規則:
1)應該創建在Where子句,連接條件,Group By,Order By語句中常用的列上
2)表經常被訪問且表的數據量大,訪問的數據大概佔總量的2%~4%
3)Orcale在創建具有主鍵約束和唯一性約束的時候自動生成唯一索引
4)經常進行DML語句的列,不適合創建索引,因爲每次DML操作都需要維護索引
5)對於按範圍查找的列,數據量很大時,最好建立索引,因爲建立索引的時候就已經排序好了
6)在多個列上建立索引(複合索引)是,只有在Where語句中,包含建立索引時第一個列纔會使用索引
2)修改索引
Alter Index index_name0 rename to index_name1; –重命名索引
Alter Index index_name coalesce; –合併索引
Alter Index index_name rebuild; –重建索引
注:合併索引是整理數據庫中的冗餘空間,然後合併。
重建索引是將舊的索引進行刪除,然後生成新的索引。
3)刪除索引
Drop Index index_name
二、SQL優化
1)SQL語句最終執行效果的順序是:From -> Where -> Group By -> Order By
在From中,對錶的解析是從右到左,需要將小表放在右邊,使得生成的基礎表成本更低
在Where中,對條件的解析也是從後往前,需要優先將能過濾更多的數據的條件放在後面
2)在查詢條件(where)語句中,使用索引,並且在語句中儘量避免索引失效 ,索引會失效的情況如下:
–發生了隱式條件轉換 –進行了算術運算(+,-,*,/) –對生成了索引的列使用了函數
–使用<>,not in, not exist, !=, or –在like中’%_’在前 –使用複合索引時,單獨引用了非第一列的索引列
–當字符型數據爲全數字,在where中引用時未添加”單引號 –將空的變量值直接與運算符(符號)進行比較(應採用IS NULL, IS NOT NULL, ISNULL()函數進行操作)
3)用 exists 代替 in
eg:select cloumn_x from table_name a where num in (select cloumn_x from table_name b)
–> select column_x from table_name a where exists(selcet 1 form table_name b where a.column_x = column_x)
4)使用 union 代替 or
eg:select cloumn_x from table_name where clolumn_y = yyy or cloumn_z = zzz
–> select cloumn_x from table_name where cloumn_y = yyy union all (select cloumn_x from table_name where cloumn_z = zzz)