mysql索引及sql执⾏顺序
1,红⿊树同⼀层级的⿊树到根结点经历的⿊树数⽬⼀样最坏情况的时间复杂度 lg n 是⼆叉树
b树结点可以有多个孩⼦ b+树⽗节点不存储数据
聚集索引)的叶⼦节点会存储数据⾏,也就是说数据和索引是在⼀起⾮聚集索引存储的是数据⾏的指针
2,InnoDB存储引擎⽀持两种常见的索引。
⼀种是B+树,⼀种是哈希。
所有记录的节点都在叶节点中,并且是顺序存放的
所有记录节点都是按照键值的⼤⼩顺序存放在同⼀层的叶节点中,各个叶⼦节点通过指针进⾏连接。由于⼀个节点中存放了多条的数据,那么检索的时候,进⾏的磁盘IO次数将会少掉很多
3,like 'abc%'会去索引中 '%abc'不会
mysql group by order by复合索引使⽤第⼀部分才会使⽤索引
索引单独使⽤,否则不使⽤索引 or and
索引缺点占空间增加删除耗时
频繁更新的不适合索引 sex值类型少不适合,
4,InnoDB存储引擎的逻辑存储结构和 Oracle⼤致相同,所有数据都被逻辑地存放在⼀个空间中,我们称之为表空间( tablespace )。表空间⼜由段( segment )、区( extent )、页 ( page )组成。页在⼀些⽂档中有时也称为块(block)
执⾏顺序
⽰例SQL:
SELECT * FROM user LEFT JOIN order ON user.id = order.uid WHERE order.price > 1000 GROUP BY user.name HAVING count(1) > 5 ORDER BY user.name LIMIT 0,10
1.FROM(将最近的两张表,进⾏笛卡尔积)---VT1
2.ON(将VT1按照它的条件进⾏过滤)---VT2
3.LEFT JOIN(保留左表的记录)---VT3
4.WHERE(过滤VT3中的记录)--VT4…VTn
5.GROUP BY(对VT4的记录进⾏分组)---VT5
6.HAVING(对VT5中的记录进⾏过滤)---VT6
7.SELECT(对VT6中的记录,选取指定的列)--VT7
8.ORDER BY(对VT7的记录进⾏排序)--游标
9.LIMIT(对排序之后的值进⾏分页)
WHERE条件执⾏顺序(影响性能)
1.MYSQL:从左往右去执⾏WHERE条件的。
2.Oracle:从右往左去执⾏WHERE条件的。
结论:写WHERE条件的时候,优先级⾼的部分要去编写过滤⼒度最⼤的条件语句。