SQL学习笔记(五) -- 索引与SQL优化

mac2022-10-06  46

一、索引——加快数据库查询速度

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)

5)任何地方都不能使用 select * from table_name …………操作,用具体的字段代替 “ * ”

6)多使用 commit 语句, 使用 truncate 代替 delete ,使用 where 代替 having , 使用 >= 代替 >

最新回复(0)