mysql索引及sql执行顺序

1, 红黑树 同一层级的黑树到根结点经历的黑树数目一样 最坏情况的时间复杂度 lg n 是二叉树
b树 结点可以有多个孩子 b+树 父节点不存储数据
聚集索引)的叶子节点会存储数据行,也就是说数据和索引是在一起 非聚集索引存储的是数据行的指针

2,InnoDB存储引擎支持两种常见的索引。
一种是B+树,一种是哈希。
所有记录的节点都在叶节点中,并且是顺序存放的
所有记录节点都是按照键值的大小顺序存放在同一层的叶节点中,各个叶子节点通过指针进行连接。由于一个节点中存放了多条的数据,那么检索的时候,进行的磁盘IO次数将会少掉很多

3,like 'abc%'会去索引中找 '%abc'不会
复合索引 使用第一部分才会使用索引
索引单独使用,否则不使用索引 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条件的时候,优先级高的部分要去编写过滤力度最大的条件语句。

猜你喜欢

转载自www.cnblogs.com/song-9527/p/10647998.html