浅谈数据库索引 数据库索引有什么用

内容导航:

  • 浅谈数据库索引
  • 数据库索引的作用

一、浅谈数据库索引数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据 。索引的实现通常使用B树和变种的B+树(mysql常用的索引就是B+树) 。
为表创建索引的好处:
  1. 通过创建索引,可以在查询的过程中,提高系统的性能 。
  2. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性 。
  3. 在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间 。
为表创建索引的坏处:
  1. 增加了数据库的存储空间 。
  2. 在插入和修改数据时要花费较多的时间(因为索引也要随之变动) 。
数据库索引有哪些呢?
索引按逻辑角度分可分为:
1.普通索引:最基本的索引,它没有任何限制 。它有以下几种创建方式:
直接创建:
CREATE INDEX indexName ON mytable(username(length));
注意:如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length 。
修改表结构创建:
ALTER mytable ADD INDEX [indexName] ON (username(length))
创建表的时候直接指定索引:
CREATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NULL,INDEX [indexName] (username(length)));
删除索引:
DROP INDEX [indexName] ON mytable;
2.唯一索引:它与普通索引类似,不同之处:索引列的值必须唯一,但允许有空值,创建时加上关键字UNIQUE 。如果是组合索引,则列值的组合必须唯一 。它有以下几种创建方式:
直接创建(关键字 UNIQUE):
CREATE UNIQUE INDEX indexName ON mytable(username(length))


修改表结构时创建(UNIQUE):
ALTER mytable ADD UNIQUE [indexName] ON (username(length))
创建表的时候直接指定唯一索引(UNIQUE):
CREATE TABLE mytable(ID INT NOT NULL,username VARCHAR(16) NOT NULL,UNIQUE [indexName] (username(length)));
3.主键索引:它是一种特殊的唯一索引,不允许有空值 。一般是在建表的时候同时创建主键索引 。
创建表时创建索引:
CREATE TABLE C(ID INT UNSIGNED NOT NULL auto_increment,username VARCHAR(16) NOT NULL,PRIMARY KEY(ID));
也可后期追加创建:
alter table mytable add primary key(列名)
4.组合索引:
索引按物理存储角度分可分为:
  1. 聚集索引:表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余连续性的记录在物理上一样连续存放 。聚集索引的缺点就是修改慢,因为为了使表记录和索引的排列顺序一致,所以在插入记录的时候会对数据页重新排序 。
  2. 非聚集索引:表记录和索引的排列顺序不一定一致,两种索引都采用B+树的结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表记录的指针 。非聚集索引层次多,不会造成数据重排 。
索引的创建原则:
  1. 在经常需要查询的列上创建索引 。
  2. 在主键的列上创建索引 。
  3. 在表连接的列上创建索引,如一些外键,可以加快连接的速度
  4. 在限定范围进行搜索的列上创建索引 。
  5. 在经常需要排序的列上创建索引 。
  6. 在where子句条件上面的列上创建索引 。
  7. 查询中很少用到的列不应加索引 。
  8. 对于那些具有很少数据值的列不应加索引,比如客户表的性别列 。
  9. bit数据类型的列不应加索引 。
  10. 类型是数据量相当大的列不应加索引,如数据类型是text,image 。
  11. 修改性能的要求远远大于搜索性能时不应加索引 。
我们平时建表的时候都会为表加上主键,在某些关系数据库中,如果建表时不指定主键,数据库会拒绝建表的语句执行 。事实上,一个加了主键的表,并不能被称之为「表」 。一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐,跟我认知中的「表」很接近 。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是上面说的「平衡树」结构 。换句话说,就是整个表就变成了一个索引 。没错,整个表变成了一个索引,也就是所谓的「聚集索引」 。这就是为什么一个表只能有一个主键,一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置 。