答: mysql的ACID是指事务的 原子性,一致性,隔离性,持久性。 其中原子性是基于 Redo/undo log机制来实现的, Redo log 记录的是事务更新后的记录值,undo log 记录的是事务更新后的记录,更新失败后,就可以根据undo log来进行回滚。
1)fulltext 索引
适用于大文件text类型以及大小超过text类型的字段。
2) NORMAL普通索引
使用经常使用的字段或者当关联表的一些字段。
3) UNIQUE 唯一性索引
当有多个字段一起表示唯一时,可以使用唯一性索引进行约束,比如用户表里的, 用户名和账号需要唯一并且不为空,那么就将 这2个字段设置一个唯一性的索引。
一般用于在查询前添加explain,用于解释查询出来的语句包含的信息。
binlog是mysql用于数据收集和数据恢复的日志管理工具。
答: 当有多个字段共同做为 索引时,如(a,b,c),如果说只用到了b,c那么最左索引匹配就会认为该索引无效,如果用到了a,c或者a,b,那么索引就会生效。
答: 根据加锁的范围,可分为全局锁(全库逻辑备份)、表级锁(表锁(表记录)、元数据锁MDL(修改表结构))、行锁。
全局锁: 给整个数据库加一个全局的读锁,表示只有当前线程能够读取到该数据库,其他线程不能进行读取和修改。
格式: Full tables with read lock
表级锁:
表锁和元数据锁(MDL)
格式: lock tables 表名 read;
设置表锁后,不能对该表进行修改操作。
行锁:
两段锁、 一致性非锁定读(MVCC多版本并发控制, innodb会用快照的形式保存历史信息)、一致性锁定读(可以解决幻读问题)。
一致性锁定读:
select .. for update
select ... lock in share mode
可以通过加一致性锁定读,当2次查询期间有insert语句过来的时候,会进入到阻塞状态,直至读取完毕后,再insert。
查看系统参数:
检测是否死锁 检测死锁机制是否开启5.7: show variables like "%innodb_deadlock_detect%"; 该命令表示如果开启死锁检测机制,那么出现死锁死,会随机自动释放一个在死锁的事务。
查询数据库事务的隔离级别: select @@transaction_isolation mysql默认的事务隔离级别为: 可重复读。
使用explain来解释select命令,可以包含是否用到索引:
答: 区别:
1) myisam存储引擎不支持事务,对于不需要事务的操作时,myisam的查询和插入的性能比innodb快的多。
2) myisam 不支持外键,innodb支持外键。
3) myisam 只支持表级锁,Innodb支持表级锁(表锁和元数据锁)和行锁(两阶段锁、一致性非锁定读(MVCC)、一致性锁定读(select … for update,select … lock in share mode))。
答:
1) B+树是一种排序好的数据结构。
2)与普通的二叉树相比,B+树只在叶子节点做存储,在同样的内存下,B+树叶子能够存储更多的节点数量,遍历起来更快速方便。
3) B+树是一一种平衡的多叉树,能够做更少的磁盘I/O, 另外叶子节点也可以连接起来,加快遍历。
答: 如: select * from A left join B on A.c=B.d where A.e="1" order by A.g;
第一步先将A表和B表做笛卡尔乘积。
第二步再通过on将上面的笛卡尔乘积的结果集进行第一次筛选。
第三步 将A表多余的行,即没有匹配到B表的行接入到上面筛选的On结果集后,空的用null填充。
第四步用where对结果集进行筛选。
第五步再通过order by 对结果集作排序。
答: 1. 读未提交,一个事务能够读取到另一个事务未提交的记录。
2. 读已提交,事务只能读取到已经提交的记录, 会出现不可重复读的问题,即同一个事务多次读取到的结果是不相同的。
3. 可重复读,即同一个事务,多次查询读取的记录是 相同的,但是会出现幻读的问题,即在读取结果的一瞬间,另外一个事务突然向数据库里插入了一条记录,那么前面的事务好像多读取了一条记录的问题。
4.可串行化,是数据库的隔离的最高级别,不会出现脏读、不可重复读、幻读的问题,但性能比较差。