索引是一种帮助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,他的选择性是最好的也是最高的
创建索引:
单个索引和联合索引:
尽量使用联合索引,因为联合索引的效率更高,使用覆盖索引,有可能减少回表查询。
-------------------------------------------------------索引设计原则------------------------------------------------------
索引设计原则:
总结: