SQL优化
一.插入优化
二.主键优化
(1)页分裂
此时为主键乱序插入,50应该放在47后面,但如果47所在的页已经放不下50这个数据了,这时候mysql会创建一个新页并找到47所在页的50%的位置,把50%后的数据放在新页中,再在后面插入新数据,最后调整链表指针,保持顺序,这种现象叫做页分裂。
(2)页合并
此时 2#page 中删除记录达到了阈值,会判断相邻两页是否可以合并,合并完如下
(3)主键设计原则
1.满足业务需求的情况下,尽量降低主键的长度
因为聚簇索引一张表只有一个,但二级索引可以有很多个,二级索引的叶子节点存放的是主键,主键过长会占过多磁盘空间,而且搜索的时候会浪费磁盘 I/O
2.插入数据时,尽量选择顺序插入,选择使用自增主键
顺序插入时,一个页写不下了就写下一个页就行了,乱序插入时会有页分裂现象
3.尽量不要使用 UUID 做主键或使用其他自然主键,如身份证号。
因为这些数据没有顺序,就会乱序插入,而且长度通常较长
4.业务操作时,避免对主键的修改
三.order by 优化![]()
创建索引前:使用的是 filesort
此时给age,phone创建联合索引
创建索引后:使用的是Using index 直接通过索引返回了有序数据
根据age和phone倒序排:
也没有使用filesort ,Backward index scan:反向扫描索引
之前都是先根据age排,再根据phone排序,如果先根据phone,再根据age排会怎么样呢?
此时也用到了 filesort 因为我们创建索引时,第一个字段是age ,先按phone排序,违背了最左前缀法则
要是按 age asc ,phone desc排序呢?
还是用到了filesort,以为创建索引时,是按age asc 再 phone asc 创建的,此时按phone 倒序排 ,就需要额外的排列
按age asc ,phone desc创建一个新的索引,会怎么样呢?
查询索引,发现该索引的Collection 是D 其他的都是A 可知此处D代表降序的意思
再次查询 此时走的索引是刚才创建的索引 这次没有使用filesort
按两种不同的方法排序所创建的索引的区别如下:
注意事项:
四.group by优化
删掉索引后 查询profession结果如下
创建联合索引后,查询profession结果如下
查询age 结果如下
查询profession和age结果如下
先用profession过滤 结果如下
注意事项:
五.limit优化
六.count优化
七.update 优化
视图
一.介绍及基本语法:
介绍:
创建:
根据student的id和name字段创建视图stu_v_1,创建好了左侧会有显示
查询:
修改:
很明显根据左侧的数据就能看出来 修改成功
使用第二种方法也修改成功
删除:
二.检查选项(cascaded)
视图既然是一个虚拟的表,自然可以增删改查,但是视图实际上并不存储数据,那么如果增加一条数据,数据去哪了?
再次根据student表重新创建视图,并且成功插入一条数据
结果数据插入到了student表里
再次插入一条id为30的数据
student表里也成功插入了这条数据,但是再次对视图进行查询发现id为30的数据没有查出来
这是因为我们创建这个视图时,规定了where id<= 20,我们插入的数据,有的却查不到,那要怎么办呢?
可以在后面加上with cascaded check option
加上这个语句,重新创建视图,插入数据
可以发现插入id为30的数据时,报错了,避免了之前的情况,于是引出了检查选项这个概念
视图除了基于表创建,也可以基于另一个视图创建
创建第一个视图时不加 with check option,增删改查时不会检查where条件
但要是第二个视图基于第一个视图创建时加上了with check option ,给视图v2增删改查时 不仅会检查v2的条件,也会检查v1的条件
例子:
v2插入7,报错,因为不满足v2的id>=10
插入26,报错,因为不满足v1的id<=20
插入15,成功
如果又有视图v3基于v2创建,且不加with check option 会怎末样呢?
执行过程:
插入11 满足id<=15 成功
插入17 因为v3没加检查选项 不会对v3本身的条件进行检查 但是会接着检查v2的条件 (因为v2加了with check option), 满足,接着检查v1的条件(因为v2基于v1创建,且加了检查选项),满足,成功
插入 28 ,检查v2的条件,满足,检查v1的条件,不满足,失败
三.检查选项(local)
给v2加上with local check option,对v2增删改查时,同样会看他所依赖的视图有没有加检查选项,但是如果他所依赖的视图 不加检查选项的话 就不会像cascaded那样检查了所有它的依赖视图的条件了
四.视图的更新及视图的作用
五.案例
比如案例二,根据三表联查创建视图,后面直接查视图就能简化操作