索引可以提升查询速度,会影响where查询,以及order by排序。MySQL索引类型如下:
-
从索引存储结构划分:B Tree索引、Hash索引、全文索引
-
从应用层次划分:主键索引、唯一索引、单值索引、复合索引
-
从索引键值类型划分:主键索引、辅助索引(二级索引)
-
从数据存储和索引键值逻辑关系划分:聚集索引(聚簇索引)、非聚集索引(非聚簇索引)
1.什么是索引
索引是为了高效获取数据的数据结构,能加快数据库查询数据的速度。
2.索引的存储方式
索引存储是由B+树来实现的,数据都存放在叶子节点,非叶子节点只存储主键值。叶子节点之间用双向指针连接,构成双向链表,由小到大排列。
3.索引的优势和劣势
优势:
- 可以提高数据的检索速度,减少IO次数。
- 通过索引列对数据进行排序,可大大提升效率。
劣势:
- 索引会占用磁盘的空间。
- 会影响更新表的效率,不仅要更新数据,还要同步更新索引。
4.常用的索引
4.1主键索引
索引列的值必须是唯一的,而且不允许有空值。
4.2唯一索引
索引列的值必须是唯一的,可以为空值。
4.3全文索引
如果在需要模糊查询的列上设置普通索引,那么使用like查询索引并不生效,此时就需要创建全文索引了。
4.4组合索引
组合索引即一个索引包含多个列,创建组合索引所需的开支比多个单值索引要小。
5.组合索引中的最左前缀原则
例如此时表中有a,b,c三列,我们创建(a,b)为组合索引,那么我们在查询时如果需要用到此索引,就需要遵守最左前缀原则,通俗的说就是我们在使用select查询语句时,where后面的条件里面必须有创建索引时的最左列(上面的a列),否则查询时索引不生效。
具体原因:在组合索引中,叶子节点从左到右是整体a有序,b的话其实并不是整体有序的,而是在a的基础上局部有序,即在每个单独的叶子节点里面b才是有序的。这样的话就很好解释了,比如我们只把b作为条件来查询,那这样的话由于b并不是整体有序的,这样和全局查询没什么区别,但是如果我们把a和b都作为条件,那么因为a是整体有序的,就可以很快的锁定满足a的条件,然后再局部的查询b就可以大大提升效率了。
举例:
- select * from table where a=’’and b=’’索引生效
- select * from table where b=’’and a=’’索引生效
- select * from table where c=’’and a=’’索引生效(利用索引下推先筛a)
- select * from table where b=’’and c=’’索引不生效
6.索引创建的原则
6.1需要创建的情况:
- 主键会自动建立唯一索引。
- 频繁的作为查询的条件的字段。
- 作为排序的字段。order
- 作为分组的字段。group
6.2不需要创建的情况:
- 表内本身的数据太少。
- 经常要增删改的表,因为要一直同步修改索引。
- 不作为查询条件的字段。
- 数据重复且分布比较均匀的字段,比如性别。