java架构师之路-高性能mysql(二)

/ java / 没有评论 / 194浏览

1.B-Tree索引的限制

    1.如果不是按照索引的最左列开始查找,则无法使用索引;

    2.不能跳过索引中的列,跳过某一列,则只会使用这一列之前的索引查找;

    3.如果查询中有某个列的范围查询,则其右边的列都无法使用索引;

    备注:一般没有特别说明,索引都是指B-Tree索引;

2.哈希索引

    基于哈希表实现,只有精确地匹配索引所有列的查询才有效;也不支持范围查找;

    特点是查询速度特别快,除非有很多哈希冲突(维护成本也会变高),才需要去遍历;

    哈希索引并不是按照索引值顺序存储的,所以无法用来排序;

    备注:只有Memory引擎显式支持哈希索引,NDB引擎支持唯一哈希索引;InnoDB支持自适应hash索引:当某些索引值被用的特别频繁的时候,会再创建一个hash索引实现快速查找;

    可以自己实现伪hash索引,方式:如果某个字段比较长,可以在表中增加一列,记录该字段hash值,然后用这一列建立索引,查询的时候用hash值和本身两个条件来查找;

3.空间数据索引(R-Tree

    和B-Tree不同,空间索引会从多个维度来索引数据,可以从任何维度组合查询;

4.全文索引

    它查找的是文本中的关键字,而不是直接比较索引中的值;更类似于搜索引擎做的事;

5.高性能的索引策略

    1.独立的列,拒绝使用函数表达式等;

    2.对于比较长的数据列,可以考虑建立前缀索引(缺点:无法进行Order by和Group by,),或者伪Hash索引,或者压缩索引(MyISAM使用);

    3.创建多列组合索引;选择合适的索引列顺序,保证大部分查询能走索引;

    4.聚簇索引:将索引和数据保存在同一块,访问速度更快;默认主键列采用;但是带来的维护成本更高;

    5.覆盖索引:索引包含所有需要查询的字段的值,就称为覆盖索引;极大的提高性能,可以从索引中直接获取数据;

    6.使用索引来对结果做排序,条件:索引的列顺序和Order by顺序完全一致,并且排序方向一致;

    7.避免创建重复冗余索引;删除未使用到的索引

6.索引和锁

    索引可以让查询锁定更少的行;Innodb在有在访问行的时候才会对其加锁,如果一不小心没有走索引而进行了全表扫描,则会锁定全表;