索引的作用是告诉存储引擎快速找到我们需要的数据,两个极端,除了主键没有任何索引,给每一个列都建立一个索引,所以索引是在mysql存储引擎层实现的,而不是在mysql服务器层实现的,不同的存储引擎的索引方式是不同的,

mysql支持的索引类型,

B-tree索引是比较常见的,通常所说的索引就是B-tree索引,特点,B-tree以B+树的结构存储数据,每个叶子到根部的距离都是 相同的,并且所有的记录节点都是按照键值的大小,在同一层上顺序排列的,并且各个叶子节点是由指针来链接的。B-tree 索引能够加快数据的查询速度,通常索引的大小远小于表中数据的大小,使用B-tree索引,存储引擎就不用全表扫描来获取需要的数据,取而代之的是从根节点开始搜索,在索引的根节点中存放了指向下层子节点的指针,存储引擎根据这些指针向下层进行查找,通过比较节点页的值通过比较节点叶的值和要查找的值呢,就可以得到合适的指针进入下层的子节点,而这些指针呢是定义了,子节点中,值得上线和下线。在innodb中叶子节点指向的是主键,在myisam中叶子节点指向的是数据物理地址,。另外B-tree索引呢 对索引是顺序存储的,所以适合范围查找,是靠键值来存储的

B-tree索引在什么情况下可以被使用到,全值匹配的查询,order_sn=‘998888’  ,匹配最左前缀的查询,匹配列前缀查询,匹配范围值的查询,order_sn>, 精确匹配左前列并范围匹配另外一列,只访问索引的查询,Btree索引可以使用在order by。

B-tree索引的限制,如果不是按照索引最左列开始查找,则无法使用索引。使用索引是不能跳过索引列中的列。not in 和,。操作无法使用索引。如果查询中有某个列的范围查询,则其右边所有列都无法使用索引, 

Hash索引的特点,

hash索引是基于hash表实现的,hash索引只有查询条件精确匹配hash索引中的所有列时,才能够使用到hash索引。

对于hash索引中的所有列,存储引擎都会为每一行计算一个hash码,hash索引是靠hash码来存储的,

hash索引的限制,hash索引不支持键值查找,hash索引不支持部分索引查找也不支持范围查找,

索引的作用,

B-tree索引键值是按顺序排列的,

索引大大减少了存储引擎需要扫描的数据量,索引文件大小远小于数据文件大小,innodb 默认一页是16k,一页可以存储更多,

索引可以帮助我们进行排序以避免使用临时表。索引可以把随机io 变为顺序io的,更加好的发挥磁盘性能,

索引会带来哪些损耗,索引会增加写操作的成本,太多的索引会增加查询优化器的选择时间,只有适当的表建立适当的索引,才是正确的做法。


索引优化策略

索引列上不能使用表达式或函数

select from product where to_days(out_date)-to_days(current_date)<=30

select from product where out_date<=date_add(current_date,interval 30 day)

前缀索引和索引列的选择性,索引的选择性是不重复的索引值和表的记录数的比值。

联合索引,如何选择索引列的顺序,经常会被使用到的列优先。选择性高的列优先。宽度小的列优先,

覆盖索引  包含了所有需要查询的字段的全部值的索引就称之为覆盖索引。

优点 可以优化缓存,减少磁盘io操作。

可以减少随即io ,变随机io操作变为顺序io操作

可以避免对innodb主键索引的二次查询。

可以避免myisam表进行系统调用 、

覆盖索引 无法使用覆盖索引的情况

存储引擎不支持覆盖索引,查询中使用了太多的列,覆盖索引索引的大小比行的数据小的多,  使用了双%号的like查询。


使用索引来优化查询

B-tree索引是靠键值顺序对来存储的,还可以用B-tree索引来做排序,

通过排序操作,按照索引顺序扫描数据。


使用索引扫描来优化排序的条件,

索引的列顺序和order by子句的顺序完全一致

索引中所有列的方向(升序和降序)和order by子句完全一致

order by 中的字段全部在关联表中的第一张表中。


利用索引优化锁

索引可以减少锁定的行数

素银可以加快处理速度,同时也加快了锁的释放


索引本身的维护和优化

删除重复和冗余的索引

primary key(id),unique key(id),index(id) 

Index(a),index(a,b)  a,b 联合索引

primary key(id),index(a,id) 

用工具查出哪些列存在重复索引

pt-duplicate-key-checker h=127.0.0.1


查找未被使用过的索引,

跟新索引统计信息及减少索引碎片,

analyze table table_name \