跟数据库打交道肯定听说过“索引”这两个字,那索引是什么?
一、索引
很多人都会拿一个例子说明,就是说索引就好比字典上的检索目录,什么通过拼音找到某个字在字典上的位置,这个虽然比较形象,但并不是索引的本质。索引是一种数据结构, 是一个帮助MySQL高效获取数据的数据结构。
我们平常说的索引,如果没有特别说明那就是B树(多路搜索树,不一定是二叉树)结构的索引。该结构有一定的规则,小的在左边,大的在右边。
数据库中的数据都有相应的物理存储地址,如下图最左边为对应的存储地址。倘若在给col2字段添加索引后,数据库系统就会产生一个数据结构,该结构以某种方式指向具体的数据,这个数据结构即为索引。
所以,索引可以简单地理解为排好序的快速查找数据结构。
二 、创建索引
索引分为一下几种:
单值索引:一个索引只包含一列。
唯一索引:索引列的值必须唯一,可以为空值。
复合索引:一个索引包含多列。
语法:
CREATE INDEX [UNIQUE] indexName ON tableName(columnName(length));
ALTER table [UNIQUE] tableName ADD INDEX indexName(columnName(length))
注:
- UNIQUE:表示唯一索引,若是唯一索引就加上
- 如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
删除索引的语法
DROP INDEX [indexName] ON mytable;
三、索引使用
创建索引的注意事项:
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建素引
- 查询中与其它表关联的字段,外键关系建立索引
- 频繁更新的字段不适合创建索引
- Where条件里们不到的字段不创建索引
- 单键/组合索引的选择问题(在高并发下倾向创建复合索引)
- 查询中排序的字段,排序字段若通过索引去访问将大大提高
- 查询中统计或者分组字段
以下情况不要创建索引:
- 表记录太少
- 经常增删改的表
- 数据重复且分布比较平均的表字段