简单了解Mysql索引

mysql索引简单了解

  • 它能帮助MySQL高效获取数据的数据结构,可以得到索引的本质,索引是数据结构。索引可以提高查询效率,可以类比字典。就是排好序的快速查找数据结构。

  • 索引会影响order by 的排序和where后面条件查

  • B树索引

    • 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样可以在这些数据结构上实现高级查找算法,这种数据结构叫索引,如下图:

  • 为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速检索出符合条件记录。

  • 项目中,在service进行删除操作,其实是软删除,不会真的删除数据,比如增加一个字段activate,1表示激活,0表示未激活,当再service中删除数据,其实执行是update操作,将数据activate变成0,其原因一是为了后续做数据分析,第二个原因是为了索引。因为频繁删除会更改索引结构,这样更新,删除会更加的慢。

  • 因为索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。

  • 我们平常所说的索引,如果没有特别指明都是B树结构组织索引,其中聚集索引,次要索引,符合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引,当然,除了B+树这种类型的索引之外,还有哈希索引等。

  • 索引优势:提高数据搜索的效率,降低数据库IO成本,通过索引列对数据进行排序,降低数据排序的成本,降低了CPU消耗。

  • 索引劣势:实际上索引是一张表,该表保存主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。虽然索引大大提高查询速度,同会降低更新表速度,如对表INSERT,UPDATE和DELETE.因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新调价了索引列的字段,都会调整因为更新带来的键值变化后的索引信息。索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间去研究建立最优秀的索引。

单值索引: 即一个索引只包含单个列,一个表可以有多个单列索引
唯一索引: 索引列的值必须唯一,但允许有空值
复合索引: 即一个索引包含多个列

索引结构:

  • BTree索引

    真实情况是,3层的B+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常高。
    
  • Hash索引

  • full-text全文索引

  • R-Tree索引

适合建立索引

  • 主键自动建立唯一索引。
  • 频繁做为查询条件的字段应该创建索引
  • 查询中与其它表关联的字段,外键关系建立索引
  • 频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引
  • Where条件里用不到的字段不创建索引。
  • 单键、组合索引的选择问题。在高并发下倾向创建组合索引
  • 查询中排序的字段,排序字段若通过索引取访问将大大提高排序速度
  • 查询中统计或者分组字段。

不适合建立索引

  • 表记录太少。300W以上数据SQL性能会下降,官方500-800W

  • 经常增删改

  • 数据重复且分布平均的表字段。

    e.g.:假如一个表有10万行记录,有一个字段A中有T和F两种值,且每个值的分布概率大概为50%,那么对这种表A字段建立索引一般不会提高数据库的查询速度
    
    索引的选择性是指索引列中不同值的数目与表中记录数的比,如果一个表中有2000条记录,表索引列有1980个不同的值,那么这个索引的选择性就是1980/2000=0.99,一个索引的选择性越接近1,这个索引效率就越高。
    

MySQL常见瓶颈

CPU: CPU在饱和时候一般发生在数据装入内存或从磁盘上读取数据时候
IO:磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
服务器硬件的性能瓶颈(通过top,free,iostat 和vmstat来查看系统性能状态)
原文地址:https://www.cnblogs.com/xujunkai/p/12491335.html