## **索引的一些潜规则**
* **覆盖索引**
>**通常开发人员会根据查询的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服务器从存储引擎接收数据的次数。**
- PHP篇
- 函数传值和传引用的区别
- 简述PHP的垃圾回收机制
- 简述CGI、FAST-CGI、PHP-FPM的关系
- 常见正则表达式
- 多进程写文件,如何保证都写成功
- php支持回调函数的数组函数
- MySQL篇
- MySQL的两种存储引擎区别
- 事务的四大特性
- 数据库事务隔离级别
- 什么是索引
- 索引有哪些数据结构,优缺点
- 索引的一些潜规则
- SQL的优化方案
- 简述MySQL的锁机制
- 死锁是怎么产生的?怎么解决?
- 简述MySQL的主从复制过程,延迟问题怎么解决
- 分布式事务的解决方案
- 数据库中间件MyCat
- Linux篇
- Linux常用命令
- 对日志文件的IP出现的次数进行统计,并显示次数最多的前5名
- WEB篇
- 跨域是怎么产生的,如何解决跨域
- Redis篇
- redis介绍
- redis和memcached区别
- redis的持久化方案
- 缓存穿透、击穿、雪崩、预热、更新、降级
- 网络篇
- 计算机网络体系结构
- 简述TCP的三次握手、四次挥手过程
- UDP、TCP 区别,适用场景
- HTTP常见状态码含义
- 设计模式篇
- 单例模式
- 简单工厂模式
- 抽象工厂模式
- 观察者模式
- 策略模式
- 注册模式
- 适配器模式
- 安全篇
- 跨站脚本攻击(XSS)
- 跨站点请求伪造(CSRF)
- SQL 注入
- 应用层拒绝服务攻击
- PHP安全
- 运维篇
- docker面试题
- 消息队列篇
- 架构篇
- 数据结构与算法篇