ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## **索引的一些潜规则** * **覆盖索引** >**通常开发人员会根据查询的where条件来创建合适的索引,但是优秀的索引设计应该考虑到整个查询。其实mysql可以使用索引来直接获取列的数据。如果索引的叶子节点包含了要查询的数据,那么就不用回表查询了,也就是说这种索引包含(亦称覆盖)所有需要查询的字段的值,我们称这种索引为覆盖索引。** * **回表** >**先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记录数据,需要扫描两次索引B+树,它的性能较扫一遍索引树更低。** * **最左前缀原则** >**最左前缀原则是指当建立了联合索引如(a,b,c)时,可以根据a/(a AND b)/(a AND b AND c)三种条件使索引进行检索,一般需要将最频繁使用的列放到最左边。当使用`=`或`in`时可以乱序a、b、c三个条件,MySQL会自动优化索引可识别的形式。另外,当遇到范围查询(LIKE、BETWEEN、>、<)则会停止匹配。** ~~~text SELECT * FROM user WHERE a=1 AND b=1 AND c>1 AND d=1 ~~~ >**上面的SQL语句建立了(a,b,c,d)的索引,只能匹配到(a AND b),遇到`d>1`直接停止使用索引匹配,不过如果建立(a,b,d,c)的索引就可以匹配到d。** * **索引下推** > **索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件 。 在使用ICP的情况下,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时才会将数据检索出来返回给MySQL服务器 。 索引条件下推优化可以减少存储引擎查询基础表的次数,也可以减少MySQL服务器从存储引擎接收数据的次数。**