数据库学习笔记(七丶索引特性)

提高数据库的性能,索引是物美价廉的东西了。不用加内存,不用改程序,不用调sql,只要执行正确的create index ,查询速度就可能提高成百上千倍。但是天下没有免费的午餐,查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO。所以它的价值,在于提高一个海量数据的检索速度。
常见索引分为:

  • 主键索引(primary key)
  • 唯一索引(unique)
  • 普通索引(index)
  • 全文索引(fulltext)--解决中子文索引问题。
    1.索引原理:
    数据库学习笔记(七丶索引特性)

索引的说明:

  • 索引占用磁盘空间。
  • 当添加一条记录,除了添加到表中,还要维护二叉树,速度有影响,但不大。
  • 当我们添加一个索引,不能够解决所有查询问题,需要分别给字段建立索引。
  • 索引是以空间换时间。

2.创建索引
一丶主键索引
1)在创建表的时候,直接在字段名后指定primary key

create table user1(id int primary key, name varchar(30));

2)在创建表的最后,指定某列或某几列为主键索引

create table user2(id int, name varchar(30), primary key(id));
create table user3(id int, name varchar(30)); 
创建表以后再添加主键 
alter table user3 add primary key(id); 

主键索引的特点:

  • 一个表中,最多有一个主键索引,当然可以使符合主键
  • 主键索引的效率高(主键不可重复)
  • 创建主键索引的列,它的值不能为null,且不能重复
  • 主键索引的列基本上是int

二丶唯一键索引
1)在表定义时,在某列后直接指定unique唯一属性。

create table user4(id int primary key, name varchar(30) unique);

2) 创建表时,在表的后面指定某列或某几列为unique

create table user5(id int primary key, name varchar(30), unique(name));

3)

create table user6(id int primary key, name varchar(30)); 
alter table user6 add unique(name);

唯一索引的特点:

  • 一个表中,可以有多个唯一索引
  • 查询效率高
  • 如果在某一列建立唯一索引,必须保证这列不能有重复数据
  • 如果一个唯一索引上指定not null,等价于主键索引

三丶普通索引创建
1)

create table user8(id int primary key, 
name varchar(20), email varchar(30), 
index(name) --在表的定义最后,指定某列为索引 
);

2)

create table user9(id int primary key, name varchar(20), email varchar(30)); 
alter table user9 add index(name); --创建完表以后指定某列为普通索引

3)

create table user10(id int primary key, name varchar(20), email varchar(30)); 
-- 创建一个索引名为 idx_name 的索引 
create index idx_name on user10(name);

普通索引的特点:

  • 一个表中可以有多个普通索引,普通索引在实际开发中用的比较多
  • 如果某列需要创建索引,但是该列有重复的值,那么我们就应该使用普通索引

四丶全文索引
当对文章字段或有大量文字的字段进行检索时,会使用到全文索引。MySQL提供全文索引机制,但是有要求,要求表的存储引擎必须是MyISAM,而且默认的全文索引支持英文,不支持中文。如果对中文进行全文检索,可以使用sphinx的中文版(coreseek)。

CREATE TABLE articles ( 
            id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
            title VARCHAR(200), 
            body TEXT, 
            FULLTEXT (title,body) 
)engine=MyISAM;

3.查询索引
1)show keys from 表名;
2)show index from 表名;
3)(信息比较简略)desc 表名;
4.删除索引
1)删除主键索引: alter table 表名 drop primary key;
2)其他索引的删除: alter table 表名 drop index 索引名; 索引名就是show keys from 表名中的 Key_name 字段

mysql> alter table user10 drop index idx_name;

3)drop index 索引名 on 表名

mysql> drop index name on user8;

5.创建索引的原则

  • 比较频繁作为查询条件的字段应该创建索引
  • 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
  • 更新非常频繁的字段不适合作创建索引
  • 不会出现在where子句中的字段不该创建索引

猜你喜欢

转载自blog.51cto.com/14289397/2545138