- 订单,库存两个表怎么保证数据一致性?
mysql用事务,存储引擎InnoDB,事务规定只有订单完成,并且相应的库存减少才允许提交事务,否则事务回滚,确保数据一致性 - 外键的作用
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。
如果设置了外键,删主表数据时,不能删
https://my.oschina.net/u/4479011/blog/4494777 - 什么事读锁,什么是写锁?
读锁又叫共享锁,可以读但不能修改
写锁又叫排它锁,它自己可读可修改,其他事务不能读也不能修改
- 数据库中,什么是锁?
- mysql事务隔离级别,说一下对事务隔离性的理解?
关系型数据库遵循ACID
READ_UNCOMMITTED(未授权读取) a读取b没提交的数据,后来b可能都回滚了,这就是脏读
导致脏读,幻读或不可重复读
READ_COMMITTED(授权读取) 读取的是已经提交的数据,a读取一个字段的值,b对这个值进行了修改,a再读的时候发现数据是改变了
幻读或不可重复读
REPEATABLE_READ(可重复读) 对同一个字段,多次的读取是一致的,a读取一个字段的值,b对这个值进行了修改,a再读的时候发现数据是一致的
幻读还是会发生
SERIALIZABLE(串行)
不会出现上述的情况,但是影响程序性能
mysql默认采取的是可重复读
幻读是啥? a把某个字段从1修改成2,b往表里又插入数据,a就发现有些数据没有改变。
6.mysql存储引擎 myisam和innodb的区别(频率高)
innodb
聚集索引,索引文件在一起,查询时查两次,1次是查索引,2是查数据
myisam 非聚集索引,不在一个文件,
-
组合索引(a,b,c)支持哪些索引查找?
不支持
b,
c,
bc
支持 a , ab,abc ab
acb 新版的mysql 进行重新排序变为abc
ac 会用到a的索引 -
什么情况下少建索引
数据字段值不多样,没必要加索引
频繁的要修改,索引要来回重建没必要加索引
平衡树旋转 -
什么是表分区?
表分区是,底层分了,但是看不到
分表是实际能看到的 -
mysql支持的分区类型有哪些?
-
MVCC 了解
-
mysql优化
业务优化,数据库设计(刚开始)
数据库索引
数据多的话,分库分表
主从 读写分离
存储过程 模块化编程 (https://blog.youkuaiyun.com/weixin_44170221/article/details/106676950)
更改mysql配置 最大连接数
选择正确的存储引擎 (innodb还是myisam)
定时清理不需要的数据,定时进行碎片整理
热点数据redis monogo替代
模糊查询es替代
服务器优化
mysql 配置优化 等等
-
大表优化
1.限制数据的范围
2.读写分离
3.缓存 mysql缓存
4.垂直分区 -
在哪些场景下索引失效?
1.没有遵循索引最左原则。 建立几个复合索引字段,最好按顺序用上
2.最佳左前缀法则,如果索引了多列,要遵循最左前缀法则,尽量不要跳过索引中间列
3.不在索引列上做任何操作,计算函数,手动类型转换
4.存储引擎不能使用索引中范围条件右边的列,就是范围查找之后的索引都失效。
5.mysql在使用!= ,<> 或者like的左模糊 例子like ‘%XX’
6.is null和is not null 有无法使用索引
7.字符串不加单引号索引失效,这里又隐式类型转换操作,更严重会导致行锁变表锁 -
哪个软件能实现数据库的高可用?
MHA
https://www.cnblogs.com/–smile/p/11475380.html -
mysql执行一条sql语句完整过程
-
mysql主从同步怎么做的?
-
cap原则
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾 -
什么是间隙锁?
锁了一页数据 锁了一个范围 -
什么是聚簇索引,非聚簇索引?
innodb的主键索引是聚集索引,就是索引的叶子节点存的是整个单条记录的所有字段值
非聚簇索引的叶子节点存的是主键字段的值。 -
回表和覆盖索引是什么意思?
以主键为查询条件的话,所有字段都会查到,不用回表。
覆盖索引是查的这个索引能查到你所需要的所有数据,不需要去另外的数据结构中去查,其实就是不用回表
怎么避免? 不是必须的字段就不要出现在select里面 或者 需要的字段建立联合索引,但是索引字段多了,存储和插入数据时消耗也更大了。
select a from xx where a>0 -
mysql死锁怎么解决?
-
如何避免死锁?
1.操作完后立即提交事务,中途不要去第三方接口或者执行一些慢逻辑,能不放事务里面的php代码,就别放到事务里面。
2.资源一次性分配
3.尽量采用乐观锁
4.采用超市设置,时间越短,锁等待时间越短,到点就会自动超市,不会继续等待锁释放
5.保证没有长事务
6.修改多个表或者多个行的时候,将修改的顺序保持一致,死锁是因为锁定资源的顺序刚好相反。
7.创建索引,可以使创建的锁关联到的数据更少。如果where后面的字段没有索引,哪怕只操作一行数据,也会锁整张表,因为锁是基于索引的。(这个是不光面试,工作也能用到)
-
间隙锁怎么预防?
-
超大分页怎么处理?
1.select * from table where id in( select id from table where age=20 limit 1000000,10)
用了覆盖索引
2.减少这种请求,只允许逐页查看
阿里巴巴处理超大分页解决办法
mysql 查100000000条都查到了,但是只返回10条
-
索引目的?
1.快速访问数据表中的特定信息,提高检索速度
2.创建唯一性索引,保证数据库中每一行数据的唯一性
3.加速表和表的连接
4.使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间 -
索引对数据库的负面影响,建立索引的原则及什么情况不宜建索引?