2020年7月16日星期四

关于sql

1. InnoDB支持事务, MyISAM不支持;2. InnoDB支持外键, 而MyISAM不支持;3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的MyISAM是非聚集索引, 也是使用B+Tree作为索引结构, 索引和数据文件是分离的, 索引保存的是数据文件的指针, 主键索引和辅助索引是独立的InnoDB的B+树主键索引的叶子节点就是数据文件, 辅助索引的叶子节点是主键的值; 而MyISAM的B+树主键索引和辅助索引的叶子节点都是数据文件的地址指针4. InnoDB支持表、行(默认)级锁, 而MyISAM支持表级锁InnoDB的行锁是实现在索引上的, 而不是锁在物理行记录上. 潜台词是, 如果访问没有命中索引, 也无法使用行锁, 将要退化为表锁8、InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键), 而Myisam可以没有9、Innodb存储文件有 .frm. ibd, 而Myisam是 .frm .MYD .MYIInnodb:frm是表定义文件,ibd是数据文件Myisam:frm是表定义文件,myd是数据文件,myi是索引文件 索引是帮助MySQL高效获取数据的排好序的数据结构  B-Tree叶节点具有相同的深度,叶节点的指针为空所有索引元素不重复节点中的数据索引从左到右递增排列 sql执行计划 explan + sql filesort文件排序方式单路排序: 是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序;用trace工具可以看到sort_mode信息里显示< sort_key, additional_fields >或者< sort_key,packed_additional_fields >双路排序(又叫回表排序模式): 是首先根据相应的条件取出相应的排序字段和可以直接定位行数据的行 ID,然后在 sort buffer 中进行排序,排序完后需要再次取回其它需要的字段;用trace工具可以看到sort_mode信息里显示< sort_key, rowid > sql分页优化让查询尽可能的少,比如覆盖索引用回表关联查询select * from employees e inner join (select id from employees order by name limit 90000,5) edon e.id = ed.id; mysql表关联的两种方式1. 嵌套循环连接(Nested-Loop Join(NLJ)算法 链接字段是索引一次一行循环地从第一张表(称为驱动表,一般是小表)中读取行, 在这行数据中取到关联字段, 根据关联字段在另一张表(被驱动表,一般是大表)里取出满足条件的行, 然后取出两张表的结果合集2. 基于块的嵌套循环连接 Block Nested-Loop Join(BNL)算法 链接字段不是索引把驱动表的数据读入到 join_buffer 中, 然后扫描被驱动表, 把被驱动表每一行取出来跟 join_buffer 中的数据做对比 对于Join关联sql的优化1.关联字段加索引, 让mysql做join操作时尽量选择嵌套循环连接(NLJ)算法2.小标驱动大表, 写多表连接sql时如果明确知道哪张表是小表可以用straight_join写法固定连接驱动方式, 省去mysql优化器自己判断的时间 straight_join相当于join类似, 但能让左边的表来驱动右边的表, 能改表优化器对于联表查询的执行顺序. 比如:select * from t2 straight_join t1 on t2.a = t1.a; 代表制定mysql选着 t2 表作为驱动表。straight_join只适用于inner join, 并不适用于left join, right join. (因为left join,right join已经代表指定了表的执行顺序) in和exsits优化原则:小表驱动大表,即小的数据集驱动大的数据集in:当B表的数据集小于A表的数据集时,in优于existsselect * from A where id in (select id from B)exists:当A表的数据集小于B表的数据集时,exists优于in将主查询A的数据,放到子查询B中做条件验证,根据验证结果(true或false)来决定主查询的数据是否保留select * from A where exists (select 1 from B where B.id = A.id) count count不计算null值select count(1) from employess; 遍历二级索引树,不遍历索引树的值select count(id) from employess; mysql5.7之后走的辅助索引select count(name) from employess; name不为空select count(*) from employess; 走辅助索引count(1) > count(name) == count(*) > count(id) mysql锁手动增加表锁 > lock table 表名称 read(write),表名称2 read(write);查看表上加过的锁 > show open tables;删除表锁 > unlock tables;读锁会阻塞写, 但是不会阻塞读; 而写锁则会把读和写都阻塞 行锁支持事物: 原子性(Atomicity),一致性(Consistent),隔离性(Isolation),持久性(Durable)并发事务处理带来的问题更新丢失, 脏读(读其他未提交事物的数据), 不可重读(修改数据), 幻读(新增数据) 

关于sql邮乐网购物商城巴士物流myyearbookLAZADA怎么入驻?LAZADA平台开店流程完整版介绍!阿里巴巴国际站-My Alibaba 新版功能升级啦! 各国疫情爆发期间,亚马逊各个站点销售被限制,运营团队还能做什么?11月去云南香格里拉旅游全攻略推荐香港旅游九大逛街购物的好地方推荐给大家2011广州美食节将于光棍节当天起隆重开幕

没有评论:

发表评论