一、索引的分类
- 单值索引:即一个索引只包含单个列,一个表可以有多个单值索引。
- 唯一索引:索引列的值必须唯一,但是允许有空值。
- 复合索引:即一个索引包含多个列。
二、语法
1、创建
CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length));
#或
ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length));
2、删除
DROP INDEX [indexName] ON mytable;
3、查看
SHOW INDEX FROM table_name;
三、4种添加数据库索引的方式
#添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list);
#创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list);
#添加普通索引,索引值可出现多次
ALTER TABLE tbl_name ADD INDEX index_name (column_list);
#指定索引为FULLTEXT,用于全文索引
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list);
四、索引结构
- BTree索引
- Hash索引
- full-text全文索引
- R-Tree索引
五、检索原理(BTree索引)
1、初始化介绍
一颗b+树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3。
P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。
真实的数据存在于叶子节点,即3、5、9、10、13、15、28、29、36、60、75、79、90、99。
非叶子节点不存储真是数据,只储存指引搜索方向的数据项,如17、35并不是真实的存在于数据表中。
2、查找过程
如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找到29,结束查询,总计三次IO。
六、那些情况适合创建索引
- 主键自动建立唯一索引;
- 频繁作为查询条件的字段应该创建索引;
- 查询中与其他表关联的字段,外键关系建立索引;
- 查询中排序的字段;
- 查询中统计或者分组的字段;
七、哪些情况不适合创建索引
- 表记录太少的不要创建索引;
- 经常增删改的表不要创建索引;
- 频繁更新的字段不要创建索引;
- where条件用不到的字段不要创建索引;
- 如果某个数据列包含许多重复的内容(数据重复且分布平均的表字段),为它创建索引就没有太大的实际效果(如国籍、性别)。例:假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段创建索引一般不会提高数据库的查询速度。
八、索引的选择性
索引的选择性是指索引列中不同值的数目与表中记录数的对比。如果一个表中有2000条记录,表索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99。
一个索引的选择性越接近于1,这个索引的效率就越高。