一、索引——加快数据库查询速度
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)