索引是什么
-
官方定义:索引(Index)事帮助mysql高效获取数据的数据结构。
-
你可以简单理解为“排好序的快速查找数据结构”(排序+查找)
-
详解,如下是一种可能的索引方式的示例:
为了加快col2的查找,右边的树节点包含的是索引键值和一个指向对应数据记录物理地址的指针。这棵树可以看到是排好序的,比当前节点大的数字在其右子树,小的在左子树,通过对树的节点查找快速找到右表中该值的位置。 -
结论:数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,它以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这个数据结构这就是索引。
-
一般来说,索引本身也很大,不可能全部存在内存中,因此往往以文件形式存在磁盘上。
-
平时说的索引,一般都是指B树索引(不一定是二叉的)
-
注意点:**索引是建立在表的数据上的。**这样会导致下面两个情况:
- 不要实际删除数据,如果删除数据,会导致按照索引查找的数据不会在原先的位置上。(采用逻辑删除)
- 频繁更新的字段不要建立索引,这样会导致之前建立的索引需要频繁更新。
优势
- 提高数据检索的效率,降低数据库的IO成本。
- 通过索引列多数据进行排序,降低对数据排序的成本,降低CPU的消耗。
劣势
- 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占空间的。
- 索引大大提高了查询速度,却会降低更新表的速度(insert、update、delete)。因为在更新表时,mysql不仅要保存数据,还要保存索引文件每次更新添加了索引列的字段,都会调整因更新带来的键值变化后的索引信息。
- 索引只是提高效率的一个因素,如果你的mysql有大数据量的表,就需要花时间建立最优秀的索引,或优化查询。