MYSQL索引概述
MYSQL索引概述
B+树:使用平衡树,可抽象理解为“排好序的快速查找结构”:
MyISAM,InnoDB引擎采用的B-tree索引,NDB引擎使用的是T-tree索引;MEMORY引擎采用的Hash索引
Hash索引与B-tree索引比较:
Hash索引仅仅能满足”=”,”IN”和”<=>”查询,无法对范围查询进行优化;
Hash索引无法利用前缀索引,无法优化排序;
Hash遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。
Hash索引在任何时候都不能避免表扫描,通过索引拿到数据位置,必须回到表中取数据,这个与InnoDB的聚簇索引的数据取出方式不同。
聚簇索引:
InnoDB的主键的索引结构中既存储索引值,又存储行的数据,这种结构称为聚簇索引,次索引仅指向对主键的引用。
优势: 根据主键查询条目比较少时,不用回行,因为数据就在主键节点下;
劣势: 如果碰到不规则数据插入时,造成频繁的页分裂。
建议:
InnoDB的buffer_page很强大,聚簇索引的主键值,应尽量是连续增长的值,而不是要是随机值(不要用随机字符串或UUID),否则会造成大量的页分裂与页移动;
(不要用随机字符串或UUID)
非聚簇索引:
MyISAM的主索引和次索引,都指向物理行(磁盘位置)。
索引覆盖:
如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要回行到磁盘再找数据.
这种查询速度非常快,称为”索引覆盖”
主键索引(PRIMARY KEY):是一种特殊的唯一索引,一表只有一个,不能为空,不能设置索引名
PRIMARY KEY [index_type] (index_col_name,...)
唯一索引(UNIQUE KEY):一表可以有多个,可以为空,列值不能重复
UNIQUE [index_name] [index_type] (index_col_name,...)
索引,组合索引(INDEX):
INDEX [index_name] [index_type] (index_col_name,...)
全文索引(FULLTEXT):
[FULLTEXT|SPATIAL] [index_name] (index_col_name,...)
使用全文索引的格式: MATCH (columnName) AGAINST ('string')
外键(FOREIGN KEY):
FOREIGN KEY [index_name] (index_col_name,...)
建议:在数据迁移过程中,先创建表结构插入数据再添加索引这样可以提高批量插入效率