索引失效
- 索引列不能有null值
- 匹配列前缀,like ‘%101’, 因为并没有针对101字段进行排序
- 对于联合索引匹配时,不是使用的第一部分 则不会使用索引,必须要以第一个索引开始查询
- or查询,只有连接每一列都加上索引时才会使用索引
- 如果列为字符串,那么在条件查询时要将数据列用引号引起来
- 如果全表扫描比索引查询快,则不会使用索引
联合索引左前缀原则
因为索引底层采用B+树叶子节点顺序排列,必须通过左前缀索引才能定位到具体的节点范围。
myisam 与 innadb区别
- 1.innadb不支持事务,行锁,b+tree存储数据方式,innadb叶子节点存储表的行数据
- myisam 支持事务,表锁,innadb,b+tree叶子节点存储行数据地址
- 数据组织方式不同,innadb插入时默认按照主键排序
mysql为什么用B+tree
平衡二叉树---->B-tree----->B+tree
树查询原则:树深度越高,磁盘查询io效率越低,b-tree一个节点可以存储两个数据
B+Ttree特点:
左子树比父节点小
每个节点可以存多个元素,并且排好序的
所有的非叶子节点都在叶子节点冗余一份
叶子节点具有指针指向下一节点
b+tree与b-tree区别
b+tree是基于b-tree,新增叶子节点与非叶子节点的联系,叶子节点是key-value形式,非叶子节点,只包含key不包含value,相邻的叶子节点采用链表形式进行连接,从而范围查询效率特别高
数据结构模拟工具
官网首页:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
Avl数据结构https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
innodb结构
页是InnoDB管理存储空间的基本单位,一个页的大小默认是16KB
页存放数据是多条数据存放在一个叶中,这些数据会按照索引的大小进行排序
页码:相当于页目录,一个目录中有多条数据地址,以这些索引中数据最小值作为标记
创建一个表的同时会开辟一个页,当我们向叶中一行一行插入数据当前页插入不进去时,此时需要开辟第二页继续插入,第一页与第二页使用双向链表连接. 后面插入页也是如此
插入第二页做法
- 现将第一页复制一份
- 开辟第二页
- 把新加放不下的数据加到第二页
- 把开始的第一页改成目录页
这样做的好处:
目录页是固定的,这一页的地址在创建表时候就固定了,这样在查询数据时候有一个总的入口
不推荐使用uuid作为主键
- 排序规则不固定
- uuid长度过长,因为一个页的大小是固定的,这样会导致页中存储的数据较少,页的数量增多会导致树的深度变高,查询速度变慢
索引为什么会提高查询效率?
比如一串数字1872 ,先排序然后建立索引,就会提高查询效率
DDL DQL DML
DDL create drop alert
DQL query where
DML insert update delete
五个聚合函数
sum max min count avg
where 与 having区别
where后面不可以接聚合函数,先分组再过滤