什么是索引?
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。
索引的数据结构
在MySql中最常用的索引数据结构是加强版多路平衡查找树,又称B+树,它是在多路平衡查找树(B树)的基础上发展而来的。
使用B树作为索引的数据结构可以提高IO的效率,减少消耗,同时可以提高磁盘的读写能力。
而B+树作为B树的升级版,具有B树的所有优点,同时又具有更多的优点:
1.具有更强的扫库、表能力。
2.具有更强的磁盘读写能力。
3.具有更强的排序能力。
4.具有更稳定的查询效率。
索引的种类
普通索引
仅加速查询。
唯一索引
加速查询 + 列值唯一(可以有null)。
主键索引
加速查询 + 列值唯一(不可以有null)+ 表中只有一个。
联合索引
多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。
全文索引
对文本的内容进行分词,进行搜索。
列的离散性
列的离散性的计算公式为该列去重后的数据条数:该列总数据条数,即
count(distinct col):count(col)
列的离散性越高,该列的数据重复性就越低,选择性就越好。因此可以得出一个结论:对数据重复性高的列不宜建立索引。
索引的基本操作
- 创建索引
--创建普通索引
CREATE INDEX index_name ON table_name(col_name);
--创建唯一索引
CREATE UNIQUE INDEX index_name ON table_name(col_name);
--创建普通联合索引
CREATE INDEX index_name ON table_name(col_name_1,col_name_2);
--创建唯一联合索引
CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);
- 通过修改表结构创建索引
ALTER TABLE table_name ADD INDEX index_name(col_name);
- 创建表时直接指定索引
CREATE TABLE table_name (
ID INT NOT NULL,col_name VARCHAR (16) NOT NULL,INDEX index_name (col_name)
);
- 删除索引
--直接删除索引
DROP INDEX index_name ON table_name;
--修改表结构删除索引
ALTER TABLE table_name DROP INDEX index_name;
一些注意事项
1.在经常变化的列上不宜建立索引,这会影响到列的删除、修改性能。
2.单列索引可以看做是特殊的联合索引,在建立联合索引时,应当将经常使用的列放在前面。
3.覆盖索引,查询到的列通过索引的信息可以直接返回,所以一般select语句中查询列时不建议使用*,而应该使用具体的列名。
4.使用类似like abc%进行查询时可能用不到索引,除非在列离散性高的情况下才有可能。
5.索引列的数据长度在满足业务的的情况下越少越好。
6.联合索引如果不是按照索引最左列开始进行查找将无法使用索引。