什么是索引
索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列。否则,数据库系统将读取每条记录的所有信息进行匹配。
索引的优势
- 提高查询速度:索引可以提高数据的查询速度,减少扫描数据表的次数,尤其是在大数据表中,可以显著提高查询效率。
- 加速排序:如果需要对结果进行排序,如果有索引,则会直接使用索引中的排序结果,而不是重新排序数据表,这样也可以提高查询效率。
- 加速分组:如果需要对结果进行分组,如果有索引,则可以直接使用索引中的分组结果,而不是重新分组数据表,这样也可以提高查询效率。
- 优化连接:如果需要进行连接查询,如果有索引,则可以使用索引中的数据进行连接操作,而不是对整个数据表进行连接操作,这样也可以提高查询效率。
- 减少磁盘I/О操作:索引可以直接定位到数据行,而不需要扫描整个数据表,这样可以减少磁盘/O操作,提高查询效率。
索引的缺点
- 索引的存储需要占用磁盘空间;
- 当数据的量非常巨大时,索引的创建和维护所耗费的时间也是相当大的;
- 当每次执行CRU操作时,索引也需要动态维护,降低了数据的维护速度。
索引的类型
- 普通索引
- 唯一索引
- 主键索引
- 组合索引
- 全文索引
创建索引
#如果只关联一个字段为单列索引,如果关联多个字段即为联合索引或组合索引。
Create [UNIQUE | FULLTEXT] INDEX index_name ON table_name(index_col_name,...);
#创建唯一索引
Create UNIQUE INDEX index_name ON table_name(index_col_name);
#创建联合索引
Create FULLTEXT INDEX index_name ON table_name(index_col_name,...);
查看索引
SHOW INDEX FROM table_name;
删除索引
DROP INDEX index_table on table_name;
索引的数据结构
B+Tree
B+Tree是对B-Tree的改进版,每个非叶子节点上只保存索引值和指针,只有叶子节点才保存数据。
MySql每个索引节点大小默认是16KB。索引值大小8B、指针值大小6B,那么一个节点可以存储1170个元素;存储1KW数据,只需要3层就可以了。
查看每个节点大小:show global status like 'innodb_page_size';
MySql为了提高性能,会预选把根节点的数据加载到内存中。那么如果是3层的树,只要2次IO就可以找到指定的数据了
所有叶子节点,使用链表串起来,大大提升了范围查询的速度