- 创建索引有哪些注意点?
- 索引应该建在查询频繁的字段,比如where查询、order排序
- 索引的个数应该适量(最多64个),索引需要占用空间,更新时也需要维护
- 区分度低的字段,例如性别,不要建索引
- 频繁更新的值,不要作为索引,维护索引文件需要成本,还会导致页分裂、IO次数增多
- 联合索引把散列性高的值放在前面,可以更好的满足最左前缀匹配原则
- 尽可能用联合索引代替多个单列索引
- 过长的字段,使用前缀索引,即截取字段的前面一部分内容建立索引
- 不建议用无序的值作为索引
- 索引哪些情况下会失效?
- 查询条件包含or,可能会导致索引失效
- 如果字段类型是字符串,where时一定用引号括起来,否则会因为隐式类型转换,索引失效
- like通配符可能导致索引失效
- 联合索引,查询时的条件不是联合索引中的第一个列,索引失效
- 在索引列上使用mysql的内置函数,索引失效
- 对索引列运算(如:加减乘除、!= /<> /not in),索引失效
- 索引字段上使用 is null is not null,可能会导致索引失效
- 左连接查询或者右连接查询 查询关联的字段编码格式不一样,可能导致索引失效
- MySQL优化器估计使用全表扫描要不使用索引快时,不适应索引
- 解释下MySQL上事务的四大特性ACID,及实现
- 原子性::redo log(被称为重做日志,是物理日志,事务提交时,必须先将事务的所有日志写入redo log持久化)
- 一致性:undo log(是逻辑日志,记录了事务的insert、update和delete操作,回滚时执行相反的操作)
- 隔离性:数据库锁及MVCC机制
- 持久性:redo log
- 事务的各个隔离级别都是如何实现的?
- 读未提交
- 读已提交
- 可重复读
- 串行化
- MySQL 主从同步延迟怎么处理?
原因:当数据库主库有较大更新并发操作时,可能会导致主从同步延迟,因为从库里面读取binlog的线程只有一个,当某个SQL在从库中执行的时间稍长,或者由于某个SQL要进行锁表就会导致主从同步延迟,主库的SQL大量积压,未被同步到从库里。就会导致主从不一致,即主从延迟。
主从同步延迟的解决方法:
- 写操作后的读操作指定发给数据库主库
- 读从库失败后,再读一次主库
- 关键业务读写操作全部指向主库,非关键业务采取读写分离
- 水平分表有哪几种路由方式?
- 范围路由:选取有序的数据列作为路由的条件,不同分段分散到不同的数据库表中;(单表数据量在 100w~1000w)
- Hash路由:选取某个列(或者某几个列组合)的值进行Hash运算,然后根据Hash结果分散到不同的数据库表中。(缺点:初始表的数量选取不好确定,且扩容比较麻烦)
- 配置路由:用一张独立的表来记录路由信息。(缺点是必须多查一次)
- 分库分表如何实现不停机扩容?
第一步:在线双写,查询走老库
>第二步:在线双写,查询走新库
第三步:旧库下线
- 分库分表会带来哪些问题?
分库的角度:
- 事务的问题
- 跨库JOIN问题:1. 代码层面关联 2. 数据异构:同步到ES的大宽表
分表的角度:
- 跨节点的count、order by、group by以及聚合函数问题
- 数据迁移、容量规划、扩容等问题
- ID问题
- 数据库CPU飙升怎么解决?
- xxxx