咱们已经知道数据页的格式是这样的:
假设咱们要查询一个名字叫作张三的人,咱们是这样查的:数据库
因此这周非索引的,就至关于全表扫描,他会一个个数据页的每行进行查找。
若是咱们查找主键id为45的数据呢(假设每一个数据页10条),咱们是这样查的:spa
这个查找包括了两个东西,一个是主键,是递增的,因此咱们在定位到数据页的时候,能够用二分查找。另一个就是索引,MySql的索引是B+树结构,索引又分为聚族索引跟非聚族索引。
索引在磁盘中,也是经过数据页的形式,因此id=45查找的过程是这样的:
在最顶层的数据页中查找,发现45比101还小,因此他就往左边的数据页查找。
而后对比45和51,发现比51小,因而就定位数据页4。
而后在数据页4中,经过二分查找到45的id。
对于非聚族索引,查找的过程也是相似的,不一样的他的叶子节点存储的是索引对应的列的值以及索引的值,因此他还要经过索引的值继续上面的操做,也就是回表。
既然索引能够提高查询效率,那咱们能够多建几个索引吗?
咱们从这几个来考虑:blog