赞
踩
答: mysql的ACID是指事务的 原子性,一致性,隔离性,持久性。 其中原子性是基于 Redo/undo log机制来实现的, Redo log 记录的是事务更新后的记录值,undo log 记录的是事务更新后的记录,更新失败后,就可以根据undo log来进行回滚。
原子性: 一个事务必须视为一个不可分割的最小工作单元,整个事务里的操作要么全部执行成功,要么全部失败。
一致性: 事务总是从一个一致性状态转换到另一个一致性状态。
隔离性: 一个事务所做的修改,在最终提交之前,其他事务是不可见的。
持久性: 事务里的所有操作最终会写入到数据库里。
适用于大文件text类型以及大小超过text类型的字段。
使用经常使用的字段或者当关联表的一些字段。
当有多个字段一起表示唯一时,可以使用唯一性索引进行约束,比如用户表里的, 用户名和账号需要唯一并且不为空,那么就将 这2个字段设置一个唯一性的索引。
需要注意的是,联合字段做唯一性索引时,做为索引的字段必须为非空,否则会出现唯一性索引失效的情况,例如a、b、c三个字段联合做唯一性索引,c允许为空,当出现如下情况时,mysql也是允许的,当c允许为null时联合的唯一性索引失效。
a | b | c |
2 | 1 | null |
2 | 1 | null |
一般用于在查询前添加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。
表锁和行锁的应用场景
表级锁使用场景以查询为主,行级锁适用于事务要求较高的系统。
使用命令 show variables like "%params%" ;
①检测mysql检测死锁机制是否开启5.7:
show variables like "%innodb_deadlock_detect%"
该命令表示如果开启死锁检测机制,那么出现死锁,会随机自动释放一个在死锁的事务。
② 查询binlog变量
show variables like "%binlog%";
select @@transaction_isolation mysql默认的事务隔离级别为: 可重复读。
例如可以查看查询的语句是否用到索引
答: 区别:
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. 可重复读,即同一个事务,多次查询读取的记录是 相同的,但是会出现幻读的问题,即在读取结果的一瞬间,另外一个事务突然向数据库里插入了一条记录,那么前面的事务好像多读取了一条记录的问题。可用mvcc解决幻读的问题,多版本控制。
4.可串行化,是数据库的隔离的最高级别,不会出现脏读、不可重复读、幻读的问题,但性能比较差。
答: 给字段添加一个约束, 在建表的时候通过check(字段>1) 给字段的值限制范围,即限制字段能为什么值。
1) 查看日志文件路径
show master status
2)在my.ini文件中 查看bin_log文件
we
答: mysql自增主键不连续的情况原因有三个:
1) 唯一键冲突
2) 事务回滚
3) insert...select的时候会出现主键id每次双倍分配导致主键id跳过的问题
insert into ..select ..
- CREATE TABLE `t1` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `c` int(11) DEFAULT NULL,
- `d` int(11) DEFAULT NULL,
- PRIMARY KEY (`id`),
- UNIQUE KEY `c` (`c`)
- ) ENGINE=InnoDB;
-
- insert into t1 values(null, 1,1);
- insert into t1 values(null, 2,2);
- insert into t1 values(null, 3,3);
- insert into t1 values(null, 4,4);
- create table t2 like t1;
- insert into t2(c,d) select c,d from t1;
- insert into t2 values(null, 5,5);
-
- select * from t2;

查询结果为:
答: 10 S
答: 聚簇索引在Mysql里是唯一的,索引和数据存储在一起,非聚簇索引指索引和数据没有放一起,类如书本后的附录目录。
因为mysql 的自增id , 正好是mysql的聚簇索引的数据的物理存放顺序和索引存放顺序是一致的。只要索引是相邻的,那么在磁盘上的位置也是相邻的,如果不是自增的情况,那么会出现更多次的磁盘io情况。
delete语句如果不加where那么会全表清空, truncate 直接全表清空,但是如果detele一个非常大的表的时候,用delete语句可能会出现"max_binlog_cache_size" 不足的情况,因为delete操作的语句会记录在binlog里,然而truncate不会记录到binlog里,记录在binlog里的好处是能恢复。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。