https://blog.csdn.net/ThinkWon/article/details/104778621
https://www.jianshu.com/p/d9389f27ca1a
https://blog.csdn.net/qq_22222499/article/details/79060495
-
Mysql和Oracle数据引擎介绍
参考: https://blog.csdn.net/cafucwxy/article/details/78319414
https://www.runoob.com/w3cnote/mysql-different-nnodb-myisam.html
①:在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyISAM
Innodb支持事务,还有行级锁和外键的约束
MyIsAm表锁.且不持支事务
②: oracle中不存在引擎的概念,但是oracle有OLTP和OLAP模式的区分 -
事务四大特性
ACID: 原子性 一致性 隔离性 持久性 -
事务的并发问题
脏读:事务A更新了数据,事务B读取了A更新但未提交的数据,之后事务A回滚操作,那么B就是脏读
不可重复读:事务A多次读取同一数据,事务B在A多次读取的过程中更新并提交了数据,导致A读取的数据不一样(侧重更新,行内容不一样)
幻读: 事务A多次读取同一数据,事务B在A多次读取的过程中删除或新增了数据并提交了数据,导致A读取的数据不一样(侧重新增和删除,行数量不一样)
解决方案:解决不可重复读 锁行, 解决幻读需要锁表。 -
事务的隔离级别
读未提交 read-uncommitted :会引发的问题 脏读 不可重复读 幻读
读已提交 read-committed :会引发的问题 不可重复读 幻读
可重复读 repeatable-read :会引发的问题 幻读
串行化 serializable :不会引发问题
MySql: Innodb支持4种事务 MyIsAm不支持
Oracle:持支2种事务 READ_COMMITED SERIALIZABLE -
InnoDB引擎的行锁是怎么实现的?
答: InnoDB是基于索引来完成行锁,for update 可以根据条件来完成行锁锁定 -
数据库设计的三大范式
参考: https://blog.csdn.net/xy3233/article/details/86314329
第一范式: 列不能重复 (列不能分割,一个列中不能有多个属性)
第二范式: 消除部分依赖 (非主属性依赖主键全部,不是依赖主键的一部分)
第三范式: 消除依赖传递 (非主属性是直接依赖于主键,还是依赖非主键列) -
MySQL B+Tree索引和Hash索引的区别,这是MySql的索引算法?
① Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位; 但只能满足 = ,in, >=,<=
② B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问;
参考: https://www.jianshu.com/p/d9389f27ca1a -
聚集索引和非聚集索引区别?
聚集索引表记录的排列顺序和索引的排列顺序一致,所以查询效率快,缺点就是修改慢
非聚集索引制定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致
主键通常自动都是聚集索引
创建索引,参考https://www.cnblogs.com/zsql/p/13808417.html -
创建索引的原则
①:最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)[加粗]就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
②:较频繁作为查询条件的字段才去创建索引
③:更新频繁字段不适合创建索引
④:重复度大的列不适合做索引 如:性别
⑤:不要过度使用索引,索引过多,会降低写操作的性能
⑥:使用短索引,如果是长字符串索引,应指定一个前缀长度,这样可以节省大量的空间
⑦:在where中的列
⑧:对于定义为text、image和bit的数据类型的列不要建立索引
⑨:索引列应该指定为NOT NULL(非空) -
使用索引一定快吗?
参考: https://blog.csdn.net/yanyu529584640/article/details/51272454 -
数据库优化方案:
1,加索引 2,sql优化避免索引失效 3,数据库碎片整理 4,数据压缩 5,减少返回数据(分页,只返回必要数据) 6,减少交互次数(批量插入) 7,left join 左边使用数据量小的表 -
count(),count(1)和count(字段名)的区别
count() ≈ count(1)
count():一共有多少行,空值(null)也算
count(字段名): 这个字段有多少个,空值(null)不算
按照效率排序的话,count(字段)<count(主键 id)<count(1)≈count() -
索引失效的场景
a,函数或表达式或数学运算 例如substr()
b,like ‘%param’ 百分号放后面可以走索引
c,is null
d, !=
e, 等号两边类型不相等 例如:列是String 条件是 int 转换的时候就不走索引了 -
索引生效场景
a, = 等号两边的类型相等
b, in
c, like ‘param%’
d, > <
e,between -
组合索引
参考: https://blog.csdn.net/qq_17555933/article/details/104351791
①: 组合索引的字段都在where条件上, 无论顺序如何都会使用索引
②: 组合索引的第一个字段必须[加黑]在where条件上, 组合索引会生效
③: order by 只能使用第一个字段,才能用到索引
④:最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)[加粗]就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。 -
慢查询优化
参考: https://www.yisu.com/zixun/170330.html -
执行计划 参考: https://blog.csdn.net/tengdazhang770960436/article/details/94065557
explain SELECT * FROMusertable
where school_id in (select school_id from schooltale where address= ‘HZ’)
查询结果: id select_type table type possible_keys key key_len ref rows Extra
行数: 几行表示有几个子查询
id:查询的顺序 id相同 从上而下 id值越大执行优先级别越高
select_type:查询类型
table:查询涉及到的表
type:访问类型
possible_keys:可能使用的索引
key:实际使用的索引
ref:连接匹配条件
rows:估算的结果集数量
extra:额外信息