mysql索引(图文并茂)
在 B-Tree 索引中又有主键索引和普通索引之分,分别来了解一下:
1、主键索引
主键索引也叫聚集索引,是按照主键构建得一棵 B+树,只要建立了主键就会自动加上索引,主键索引得特
索引类型 在 B-Tree 索引中又有主键索引和普通索引之分,分别来了解一下: 1、主键索引 主键索引也叫聚集索引,是按照主键构建得一棵 B+树,只要建立了主键就会自动加上索引,主键索引得特点是:叶子节点上存放着整张表得行记录数据,所以叶子节点也叫数据页。 正是因为这个特点,对于主键的排序查找和范围查找速度非常快,因为索引上就有用户需要查询的数据,所以不会要回表查询,这样就加快了查询速度,关于什么是回表,普通索引的时候再聊一聊。 2、普通索引 普通索引也叫二级索引,跟主键索引的主要区别在于叶子结点没有存放行记录的全部数据,只包含了需要的键值,还有一个标签,用来告诉存储引擎在哪里可以找到这行数据。 普通索引因为行记录里没有数据的全部信息,在使用普通索引查询时,需要现在普通索引树上搜索一遍,再回到主键索引树上查询到需要的信息,这个过程也叫回表。 全文索引是一种比较特殊的索引,一般都是基于倒排索引来实现的,es 也是使用倒排索引。倒排索引跟 B-Tree 索引一样也是一种数据结构,在辅助表中存储了单词与单词自身在一个或多个文档中所在位置的映射。 B+树主键索引图解 查询流程:select * from user where id>=18
数据页详解 辅助索引 索引本质 索引本身是一种数据结构,存放着每条数据在磁盘上对应的地址 数据结构 1:数组 需要进行扩容,插入慢,查找快 2:单向链表 由多个节点组成,每个节点存储数据和下个节点的地址,插入快,查找慢,增加数据不需要扩容,修改节点的指针域即可 3:双向链表 解决单向链表只能向前不能向后的问题,由多个节点组成。每个节点存储数据以及上个节点,下个节点的指针 4:二叉树 如果插入元素是有序的二叉树会退化成链表(斜树) 5:平衡二叉树(AVL) 每个节点存放节点元素,左下节点指针,右下节点指针,通过左旋右旋控制树的平衡 6:多路平衡查找树:B树 节点可以拥有多个子节点数量,减少深度,减少IO 节点关键数为n,子节点数量n+1 7:b+树->加强版的多路平衡查找树 节点的关键数为n,子节点数量也为n,只有叶子节点才存放数据 数据表引擎 1:Myism 索引和数据分别存放 2:Innob 索引和数据存放在同一个文件中,主键索引为聚集索引,其他索引(二级索引,辅助索引)都为非聚集索引 聚集索引 1:如果一个表有主键,则主键就是聚集索引 2:无主键,则选用索引为Unique且列不含null值的字段 3:否则使用内置的可自增的rowid 列的离散度 计算公式:SELECT COUNT(DISTINCT(colum))/COUNT(*) from table 数据重复度越高,离散度越低,扫描越慢,不适合建索引 索引查看 show indexes from table; Cardinality表示对应索引字段不重复的行数 执行计划查看 通过explain + sql 可以查看sql 的执行情况 聚合索引(遵循最左原则) 联合索引建立以后索引如何会被使用:
WHERE name=‘slave’ and age=‘10’ and email=‘158970’ 重点:从左开始,且不可跳过 覆盖索引:Using index 显示列所需要的字段,建有索引,没有其他非索引字段,则不需要回表,会使用覆盖索引 创建索引: 1:where判断条件,order排序,join连接的on字段 2:索引个数不宜太多,本身也是数据结构,太多会造成写入的性能变差 3:列散列度太低,不要建索引 4:频繁更新的值,不作为主键或者是索引 5:联合索引,将散列度高的字段放在前面 6:复合索引存在以后,不需要再建立单例索引 7:无序的字段不建立索引(身份证号mysql索引表,UUID) 索引失效 1:索引列进行函数计算 2:字符串where条件未加引号,会发生隐式的转换 3:like 条件以%起始 4:存储引擎不能使用索引中范围条件右边的列 5:!=, is null,is not null也无法使用索引 6: 少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索 比例、表大小等多个因素整体评估是否使用索引
什么样的数据适合做索引 1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 5、索引应该建在选择性高的字段上; 6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引; 7、复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替: A、正确选择复合索引中的主列字段,一般是选择性较好的字段; B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引; C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引; D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段; E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引; 8、频繁进行数据操作的表,不要建立太多的索引; 9、删除无用的索引,避免对执行计划造成负面影响 (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |