【数据库复习_索引】

来源:互联网 发布:看漫画学日语知乎 编辑:程序博客网 时间:2024/04/19 05:36

首先,看下书上写的一句话:如果,你的表数据日常更新比较少,应当使用索引技术。

一.索引的类型

索引大致可以分为聚集索引、非聚集索引、全文索引、xml索引和空间索引5大类型。此外包括唯一索引、列索引、索引视图、筛选索引。


1.聚集索引:

表中数据行的物理顺序与聚集索引的物理顺序一致。因此每张表只能有一个聚集索引。

2.非聚集索引

非聚集索引具有独立于数据行的结构。非聚集索引包含的键值,并且每个键值都有指向包含该键值的数据行的指针。从非聚集索引中的索引行指向数据行的

指针成为行定位器。

3.全文索引

全文索引是一种特殊类型的基于标记的功能性索引,由全文引擎生成和维护。

4.xml索引

对xml数据类型创建xml索引。

5.空间索引

支持sql server 2008~.主要用于处理空间数据。

6.唯一索引

唯一索引可以保证索引健中不包含重复的值,从而使表中的每一行从某种方式上具有唯一性。聚集索引和非聚集索引都可以是唯一的。只要列中的数据是唯一的,就可以为

同一个表创建一个唯一聚集索引和多个唯一非聚集索引。

通过上面的介绍,可以看出来索引包含一下特性:

聚集还是非聚集

唯一还是非唯一

单列还是多列

索引中的列是升序还是降序

非聚集索引是全表还是经过筛选


二.常规索引设计原则

1.数据库注意事项

a).一个表中如果有大量的索引,会影响insert、update、delete等操作的性能。

视图中包含聚合、表连接或者聚合、和连接的组合时。视图索引可以显著的提升性能。

b).查询注意事项

为经常用于查询中的谓词和连接条件的所有列创建非聚集索引。

将插入和修改尽可能多的行的查询写入单个语句内。


三,创建索引

1.创建聚集索引

在创建一个表时,如果没有创建该表的聚集索引并且未指定唯一非聚集索引,则将自动对一列或者多列创建唯一聚集索引。

对于mysql来说:InnoDB按照主键进行聚集,如果没有定义主键,InnoDB会试着使用唯一的非空索引来代替。如果没有这种索引,InnoDB就会定义隐藏的主键然后在上面进行聚集。

所以,对于 聚集索引 来说,你创建主键的时候,自动就创建了主键的聚集索引。

2.创建非聚集索引

形式:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON tbl_name (index_col_name,...) [index_type] 
create table indexTable(id int not null,    name varchar(20));create unique index id_index on indexTable(id)

修改表的结构的方法来创建索引:
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
3.组合索引

平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:

–title,time

–title

为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引,如下面的几个SQL所示:

1–使用到上面的索引
2SELECT FROM article WHREE title='测试' AND time=1234567890;
3SELECT FROM article WHREE title='测试';
4–不使用上面的索引
5SELECT FROM article WHREE time=1234567890;

四.删除索引
drop index 索引名 on 表名
drop index id_index  on indexTable

五.索引的优化<摘自blog:>

上面都在说使用索引的好处,但过多的使用索引将会造成滥用。因此索引也会有它的缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。

因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会

膨胀很快。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。下面是一些总结以及收藏的MySQL索引的注意事项和优化方法。

1. 何时使用聚集索引或非聚集索引?

动作描述使用聚集索引使用非聚集索引列经常被分组排序使用使用返回某范围内的数据使用不使用一个或极少不同值不使用不使用小数目的不同值使用不使用大数目的不同值不使用使用频繁更新的列不使用使用外键列使用使用主键列使用使用频繁修改索引列不使用使用

事实上,我们可以通过前面聚集索引和非聚集索引的定义的例子来理解上表。如:返回某范围内的数据一项。比如您的某个表有一个时间列,恰好您把聚合索引建立在了该列,这时您查

询2004年1月1日至2004年10月1日之间的全部数据时,这个速度就将是很快的,因为您的这本字典正文是按日期进行排序的,聚类索引只需要找到要检索的所有数据中的开头和结尾数据

即可;而不像非聚集索引,必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容。其实这个具体用法我还不是很理解,只能等待后期的项目开发中慢慢学学了。

2. 索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

3. 使用短索引

对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提

高查询速度而且可以节省磁盘空间和I/O操作。

4. 索引列排序

MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要

包含多个列的排序,如果需要最好给这些列创建复合索引。

5. like语句操作

一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

6. 不要在列上进行运算

例如:select * from users where YEAR(adddate)<2007,将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成:select * from users where adddate<’2007-01-01′。

关于这一点可以围观:一个单引号引发的MYSQL性能损失。

最后总结一下,MySQL只对一下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。而理论上每张表里面最多可创建16个索引,不过除非是数

据量真的很多,否则过多的使用索引也不是那么好玩的,比如我刚才针对text类型的字段创建索引的时候,系统差点就卡死了。

0 0
原创粉丝点击