索引

索引(Index)是帮助 MySQL 高效获取数据的数据结构。
常见的查询算法,顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树 B 树(B-tree)。
http://www.liuzk.com/410.html

数据结构

二叉查找树

有可能会形成单向链表

平衡二叉树

每个节点的左右子树的高度差不能超过 1。 相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。

B 树

B 树相对于平衡二叉树,每个节点存储了更多的键值(key)和数据(data),并且每个节点拥有更多的子节点
B树进行范围查找和排序则要对树进行递归遍历

B+ 树

非叶子节点上是不存储数据的,仅存储键值,查找数据进行磁盘的 IO 次数又会再次减少,数据查询的效率也会更快。
所有数据均存储在叶子节点,而且数据是按照顺序排列的。叶子节点中的数据是通过单向链表连接。方便范围查询

最左匹配规则

重复值越少的越放前面

唯一索引
在更新数据时,如果更新的页不在内存中的话,由于需要进行唯一性检 查,所以必须把 page 读到内存中,判断后进行操作
不同索引
在更新数据时,如果更新的页不在内存中的话,由于不需要进行唯一性 检查,所以直接写入到 change buffer 中,持久化交给 redo log 来做
Change Buffer
当我们更新一条数据时,如果该数据的 page 在内存中则直接进行更新。若该数据页不在内存中,且不会影响数据一 致性的前提下,InnoDB 会将这个修改写入至 change buffer 中(change buffer 随 redo log 持久化),后续再读 取该行数据时,将数据读入内存,然后执行 page 和 change buffer 的 merge 操作
使用 change buffer 明显可以加快 update 语句的执行,不需要将 page 从硬盘中读取至内存中

优化
1.字段尽可能设置的小
2.join代替子查询
连续的数值,能用 between 就不要用 in 了
LIKE前缀%号
表数据量的增加,直接使用limit分页查询会越来越慢。优化的方法如下:可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点
存储引擎不能使用索引中范围条件右边的列。
如这样的sql: select * from user where username=’123’ and age>20 and phone=’1390012345’,其中username, age, phone都有索引,只有username和age会生效,phone的索引没有用到。

用小结果集驱动大结果集
性能优化,left join 是由左边决定的,左边一定都有,所以右边是我们的关键点,建立索引要建在右边。
尽量用inner join(因为其会自动选择小表去驱动大表).避免 LEFT JOIN (一般我们使用Left Join的场景是大表驱动小表)和NULL,那么如何优化Left Join呢?
1、条件中尽量能够过滤一些行将驱动表变得小一点,用小表去驱动大表
2、右表的条件列一定要加上索引(主键、唯一索引、前缀索引等),最好能够使type达到range及以上