花1分钟了解聚集索引、非聚集索引、联合索引、索引覆盖。比如业务场景,user表,表结构为:t_user(uidprimarykey,login_nameunique,passwd,login_time,age,...);聚簇索引(clusteredindex):聚簇索引决定了数据在磁盘上的物理排序,一张表只能有一个聚簇索引,一般受主键约束。示例:t_user场景下,uid上的索引。非聚集索引(non-clusteredindex):它不决定数据在磁盘上的物理顺序,索引只包含被索引的数据,还有一个行定位器row-locator,这个行定位器可以理解为一个A指向聚集索引的物理排序的指针,通过它可以找到行数据。比如找一个年轻MM的业务需求:selectuidfromt_userwhereage>18andage<26age建在上面的索引是非聚集索引。联合索引:建立在多个字段上的索引,可以加快评论查询条件的检索。比如登录业务要求:selectuid,login_timefromt_userwherelogin_name=?andpasswd=?可以创建(login_name,passwd)的联合索引。联合索引可以满足最左查询的要求。比如三列(a,b,c)的联合索引可以加速a|三组的查询需求(a,b)|(a,b,c)。这就是为什么没有建立联合索引如(passwd,login_name)的原因。业务中passwd的单条件查询需求几乎没有,但是login_name的单条件查询需求很多。问题:selectuid,login_timefromt_userwherepasswd=?andlogin_name=?你能***(login_name,passwd)这个联合索引吗?答:是的,最左查询要求并不是说SQL语句的写法一定要满足索引的顺序(这是很多朋友的误解)索引覆盖:要查询的列,数据可以从索引而不是行定位器,然后到行获取,即“要查询的列应该被建立的索引覆盖”,可以加快查询速度。比如登录业务要求:selectuid,login_timefromt_userwherelogin_name=?andpasswd=?可以创建(login_name,passwd,login_time)的联合索引,由于索引中已经建立了login_time,所以查询的uid和login_time不需要去行取数据,从而加快查询速度。最后再说一点,登录这个业务场景,login_name是唯一的,建这个单列索引就好了。作业:假设订单有3种状态:0已下单,1已付款,2已完成业务需求。查询未完成的订单,哪个SQL更快?select*fromorderwherestatus!=2select*fromorderwherestatus=0orstatus=1select*fromorderwherestatusIN(0,1)select*fromorderwherestatus=0unionselect*fromorderwherestauts=1【本文为专栏作者“58神剑”原创稿件,转载请联系原作者转载】点此查看该作者更多好文
