索引:从本质上来说索引就是一个数据结构,索引也是磁盘文件。使用索引需要进行磁盘IO操作。当索引文件过多时,数据的改变会导致索引的更改,而索引也涉及了磁盘的IO操作。当表中的数据增加到几十万或者几百万时,查询数据将会很慢,所以引入了一个索引。目的是提高查询的效率。
索引的类型:单列索引 多列索引
unique 和 primary key自动会创建索引
在InnoDB中,主键索引(即聚簇索引)和辅助索引(即非聚簇索引)的数据存储方式是不同的:
-
聚簇索引(Clustered Index):
- InnoDB会根据主键创建聚簇索引,数据行的物理存储顺序与主键值的顺序相同。
- 数据行的实际数据存储在B+树的叶子节点上,因此查询主键时可以直接从叶子节点读取到完整的行数据。
- 聚簇索引的叶子节点不仅包含了索引键(主键值),还包含了与该键相关联的所有行数据。
-
辅助索引(Secondary Index):
- 辅助索引的叶子节点只包含索引键值和对应的主键值。为了找到完整的行数据,需要先通过辅助索引找到主键,然后再通过聚簇索引查找相应的行数据。
总结来说,InnoDB引擎下的数据确实是存储在索引树节点上的,具体的存储方式取决于数据是通过聚簇索引还是辅助索引进行访问的。
- 索引结构:索引通常采用B树或B+树结构,这种平衡树结构能够保持数据按序存储,使得在树中的查找、插入、删除操作的时间复杂度为O(log n)。这意味着即使在大型数据集上,查找特定数据的速度也能保持在一个较低的水平。
- 快速定位:通过索引,数据库可以快速定位到需要的行,而不需要遍历整个表。尤其是在查询条件中使用了索引字段,数据库可以直接跳转到相应的索引节点,避免不必要的扫描
当没有索引时,进行全表扫描,而有索引时只需要进行索引扫描速度会更快一些。const是主键或者唯一键,而ref是扫描索引。通过explain去观看索引使用的情况。
当给name列加上索引时:经常作为where过滤条件时要加上索引,字符串列创建索引时尽量控制索引的长度不能过程。索引字段涉及类型强转或者函数将不会使用索引。
删除索引:drop index nameindex on student;