索引
减少查询需要扫描的数据量(加快了查询速度) 减少服务器的排序操作和创建临时表的操作(加快了groupby和orderby等操作) 将服务器的随机IO变为顺序IO(加快查询速度).但是索引占用磁盘或者内存空间 减慢了插入更新操作的速度。
Innodb B+树索引适用于
- 全值匹配
- 匹配最左前缀
- 匹配列前缀
- 匹配范围值
- 精确匹配某一列并范围匹配另一列
- 只访问索引的查询
B+树索引与哈希索引比较
- 哈希索引只支持等值查询,不支持任何范围查询,因为哈希索引数据不是按照索引值顺序存储,同样哈希索引不支持使用索引进行排序
- 哈希索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测.AAAA和AAAAB的索引没有相关性
- 哈希索引只包含哈希值与行指针,任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询
- 哈希索引虽然在等值查询上较快,但是不稳定.性能不可预测,当某个键值存在大量重复的时候,发生哈希碰撞,此时效率可能极差.而B+树的查询效率比较稳定
聚簇索引和非聚簇索引
聚簇索引本质为一种数据的存储方式,通常是数据行存放在索引的叶子叶中。因为无法把数据行同时存放在两个地方,所以一个表只能有一个聚簇索引。Innodb通常通过主键索引聚簇数据。如果没有定义主键那么Innodb会选择第一个唯一非空索引作为聚簇索引,如果没有主键也没有合适的唯一索引,那么Innodb内部会生成一个隐藏的主键作为聚集索引。
前缀索引
在对一个比较长的字符串进行索引时,可以仅索引开始的一部分字符,这样可以大大的节约索引空间, 从而提高索引效率.但是这样也会降低索引的选择性.
覆盖索引
当一个索引包含(或者说是覆盖)需要查询的所有字段的值时,我们称之为覆盖索引.
Innodb自适应哈希索引
Innodb存储引擎支持的哈希索引是自适应的,它会自动根据表的使用情况自动生成哈希索引,不能人为干预是否在一张表中生成 哈希索引。innoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之 为自适应哈希索引.可以使用innodb_adaptive_hash_index参数来禁用或启用此特性,默认开启。
全文索引
高性能索引策略
- 独立的列,即索引列不能是表达式的一部分,也不能是函数的参数
- 前缀索引,对于索引字符列很长的情况可选择字符列开始部分作为索引,节省索引空间,但是也会降低索引选择性
- 避免为每个列创建单独的索引,应考虑使用联合索引
- 选择何时的索引列顺序,当不需要考虑排序和分组时,通常选择将选择性最高的列放在联合索引的前面
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。