数据库索引-初级知识get

来源博客1:深入浅出数据库索引原理

来源博客2(超级推荐~~)数据库索引全解

来源博客3:正确合理的建立MYSQL数据库索引


创建索引:

CREATE INDEX indexName ON mytable(username(length));如果是CHAR VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

 删除索引:

DROP INDEX [indexName] ON mytable; 

(2)唯一索引

它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 

创建索引:

CREATE UNIQUE INDEX indexName ON mytable(username(length)); 

(3)主键索引

它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引: 

 CREATE TABLE mytable(   ID INT NOT NULL,    username VARCHAR(16) NOT NULL,   PRIMARY KEY(ID) ); 

(4)组合索引 


很大一部份程序员对索引的了解仅限于到“加索引能使查询变快”这个概念为止。

  • 为什么要给表加上主键?

  • 为什么加索引后会使查询变快?

  • 为什么加索引后会使写入、修改、删除变慢?

  • 什么情况下要同时在两个字段上建索引?

想要理解索引原理必须清楚一种数据结构「平衡树」(非二叉),也就是b tree或者 b+ tree,重要的事情说三遍:“平衡树,平衡树,平衡树”。

 主流的RDBMS都是把平衡树当做数据表默认的索引数据结构的。


如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,也就是上面说的「平衡树」结构,换句话说,就是整个表就变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键, 一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。


什么样的字段不适合建索引?

一般来说,列的值唯一性太小(如性别,类型什么的),不适合建索引(怎样叫太小?一半说来,同值的数据超过表的百分之15,那就没必要建索引了) 
太长的列,可以选择只建立部分索引,(如:只取前十位做索引) 
更新非常频繁的数据不适宜建索引(怎样叫非常?意会)

大多数情况下索引能大幅度提高查询效率,但:

  • 数据的变更(增删改)都需要维护索引,因此更多的索引意味着更多的维护成本
  • 更多的索引意味着也需要更多的空间 (一本100页的书,却有50页目录?)
  • 过小的表,建索引可能会更慢哦 :) (读个2页的宣传手册,你还先去找目录?)

多列查询该如何建索引?

一次查询只能用到一个索引,所以 首先枪毙 a,b各建索引方案

a还是b? 谁的区分度更高(同值的最少),建谁!

当然,联合索引也是个不错的方案,ab,还是ba,则同上,区分度高者,在前


覆盖索引(Covering Indexes)拥有更高效率

索引包含了所需的全部值的话,就只select 他们,换言之,只select 需要用到的字段,如无必要,可尽量避免select *

NULL 的问题

NULL会导致索引形同虚设,所以在设计表结构时应避免NULL 的存在(用其他方式表达你想表达的NULL,比如 -1?)

一次查询能用多个索引吗?

不能


什么情况下使用索引
       表的主关键字

自动建立唯一索引

表的字段唯一约束

ORACLE利用索引来保证数据的完整性

直接条件查询的字段

在SQL中用于条件约束的字段

查询中与其它表关联的字段

字段常常建立了外键关系

查询中排序的字段

排序的字段如果通过索引去访问那将大大提高排序速度

查询中统计或分组统计的字段


什么情况下应不建或少建索引

表记录太少

 

经常插入、删除、修改的表

 

数据重复且分布平均的表字段

 

经常和主字段一块查询但主字段索引值比较多的表字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值