索引是一种帮助mysql高效获取数据的数据结构(有序)。

注意:上述二叉树索引结构的只是一个示意图,并不是真实的索引结构。
优缺点:

--------------------------------------------------------索引结构-----------------------------------------------------------
MySQL的索引实在存储引擎层实现的,不同的存储引擎有不同的结构


我们平时说的索引,如果没有特别指明,都是指B+树结构组织的索引。
二叉树:

二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据情况下,层级较深,索引较慢。
红黑树:

红黑树缺点:大数据情况下,层级较深,索引较慢。
B-tree(多路平衡查找树):

B+tree


相对于b-tree的区别:
所有的数据都会出现在叶子节点
叶子节点形成一个单向列表。
Hash:


Hash特点:

在MySQL中,支持hash索引的是memory引擎,而InnoDB引擎具有自适应hash功能,hash索引是存储引擎根据B+tree索引在指定条件下自动构建的。
--------------------------------------------------------索引分类-----------------------------------------------------------

在InnoDB存储引擎中,根据索引的存储形式,又可以分为下面两种

聚集索引选取规则:

聚集索引和二级索引如下图:
回表查询:

思考:

--------------------------------------------------------性能分析-----------------------------------------------------------
SQL执行频率
show global status like 'om__' 查看库的执行频率
慢查询日志

show variables like 'slow_query_log' ;慢查询日志

profile详情


explain执行计划




--------------------------------------------------------索引使用-----------------------------------------------------------
验证索引效率

最左前缀法则 :


详情查看黑马mysql进阶23
范围查询:


索引页运算:
不要在索引页进行运算操作,索引将失效。
进行函数运算就会导致索引实效,而走all type 。性能可能会降低,查询时间变长
补充:substring(列名,第几位,几个)= '什么';

字符串不加引号:
字符串类型字段使用时,不加引号,索引将失效。

模糊查询:
如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

or链接的条件:
用or分隔开的条件,如果or前的条件中的列有索引,而or后面的列中没有索引,那么涉及的索引都不会生效。

primary key 也会失效。
数据分布影响
如果MySQL评估使用索引比走全表还慢。则不使用索引。
SQL提示:
就是在SQL语句中加入一些人为的提示来达到优化操作的目的。

覆盖索引(重要):
尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中能全部找到),减少select*


前缀索引:

eg:
为1,他的选择性是最好的也是最高的

创建索引:
单个索引和联合索引:
尽量使用联合索引,因为联合索引的效率更高,使用覆盖索引,有可能减少回表查询。


-------------------------------------------------------索引设计原则------------------------------------------------------
索引设计原则:

总结:












