1.mysql中innodb和myisam的区别?
innodb和myisam是一种表驱动。
MySQL支持多种存储引擎,用户可以方便的选用不同的存储引擎来支持自己的应用,每种不同的存储引擎都有其自己的特性
Innodb是其中的一种存储引擎,它的特性是支持事务,并且采用多版本并发控制的方式来提高并发度主要是事务表,当一个事务全部完成,才会执行update.如果一段代码没有完成(及一个事务操作没有完成)它是不会update的.innodb的特色在于支持并发与表间引用
例如:银行转帐,一笔业务没有完成的时候,突然的断电,或是,网络,系统的原因使你无法完成此交易的话,这个事务是要回滚的此交易之前的状态的,没有完成交易,你银行的money是不会减少的!
缺点是,innoDB的表执行起来速度较慢,但是安全!bbs的表要求的是速度,用的都是myisam的表!
- InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
5. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
如何选择
1. 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM;
2. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB。
3. 系统崩溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB;
4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的。如果你不知道用什么存储引擎,那就用InnoDB,至少不会差。二、SQL语句分类
一、SQL(结构化查询语言)
结构化查询语言(Structured Query Language)简称SQL,结构化查询语言是一种数据库查询和程序设计语言,用于存放数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。二、SQL分类
1.数据查询语言(DQL)
数据查询语言(Data Query Language, DQL)是SQL语言中,负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有FROM,WHERE,GROUP BY,HAVING和ORDER BY。这些DQL保留字常与其他类型的SQL语句一起使用。2.数据定义语言(DDL)
数据定义语言 (Data Definition Language, DDL) 是SQL语言集中,负责数据结构定义与数据库对象定义的语言,由CREATE、ALTER与DROP三个语法所组成,最早是由 Codasyl (Conference on Data Systems Languages) 数据模型开始,现在被纳入 SQL 指令中作为其中一个子集。3.数据操纵语言(DML)
数据操纵语言(Data Manipulation Language, DML)是SQL语言中,负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。4.数据控制语言(DCL)
数据控制语言 (Data Control Language) 在SQL语言中,是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。由 GRANT 和 REVOKE 两个指令组成。DCL以控制用户的访问权限为主,GRANT为授权语句,对应的REVOKE是撤销授权语句。5.指针控制语言(CCL)
它的语句,像DECLARE CURSOR(declare cursor),FETCH INTO(fetch into)和UPDATE WHERE CURRENT(update where current)用于对一个或多个表单独行的操作。6.事务处理语言(TPL)
它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION(begin transaction),COMMIT(commit)和ROLLBACK(rollback)。3.事务的ACID特性
原子性(Atomicity) :
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。一致性(Consistency) :
事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。隔离性(lsolation) :
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。持久性(Durability) :
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。4.脏读、幻读、不可重复读
事务的隔离性
事务中有一个重要的特性“事务的隔离性”指的是事务和事务之间不应该相互影响,保持隔离,然而在现实中多个事务可能会操作同一个数据,造成并发问题:
脏读:一个事务读取到了另一个事务尚未提交的数据。
不可重复读:事务一读取到了age的值20,事务二将该值修改成了28,事务一再次读取age的值28,事务一两次读取的age值不一致。
幻读:事务一读取到A表中有一条记录,事务二往A表中插入一条记录,事务一再次读取的时候记录变成了两条,就像发生幻觉一样。
不可重复读和幻读很相似,可以从两个角度理解两者的差别:不可重复读是另一个事务修改了数据,导致该事务多次读取出来的值不一样,而幻读是另一个事务插入或删除了记录,导致该事务多次读取出来的记录数不一样
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致。
3、幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。
不可重复读的解决只需要锁住会发生修改的记录就可以,幻读需要锁住更大的范围。
正是因为有这些问题存在,数据库设置了隔离级别来处理:数据库的隔离级别
读未提交(read uncommitted): 事务中的修改,即使没有提交,其他事务也可以看得到
在这种隔离级别下有可能发生脏读,不可重复读和幻读。
一家酒店对外预定房间,现在还剩四间房,一个顾客到小王这里来预定四间房,小王查询系统发现还剩四间就将这四间房预定出去,该事务还没提交的时候另一个顾客到小李这里来预定房间,小李查询系统发现没房了,就拒绝了这个订单,此时小王的电脑发生故障,事务回滚,订单失效,这就是脏读造成的影响。
读已提交(read committed): 事务中的修改只有提交以后才能被其它事务看到。在这种隔离级别下有可能发生不可重复读和幻读。
还是定房间的例子,一个顾客到小王这里来预定四间房,小王将这四间房预定了出去,该事务还没提交的时候另一个顾客到小李这里来预定房间,小李查询系统发现还有四间房,刚想预定的时候小王的事务提交了,小李的系统立马呈现0间房。这就是不可重复读造成的影响。
可重复读 (repeatable read):该级别保证了在事务中看到的每行的记录的结果是一致的,但是这种级别下有可能发生幻读。
公司规定如果销售额达不到就要扣工资,经理查询小王的销售业绩,发现还差几间房,经理喜上眉梢,把结果打印出来,结果打印出来的结果业绩正好合格,原来小王在这当口又卖了几张票正好填上了这个空缺。这就是幻读造成的影响。
串行化(serializable):该级别下所有的事务都是串行执行的,一个事务执行完了才能执行其它的事务,可以解决所有的并发问题,它是靠大量加锁实现的,所以效率很低下。只有在需要绝对保证数据一致性,并且并发量不大的情况下,可以考虑。
5.内连接、左外、右外、子查询的意义和差异
内连接:只连接匹配的行
左外连接:包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接:包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
例如1:
SELECT a.,b.FROM luntan LEFT JOIN usertable as b ON a.username=b.username
例如2:
SELECT a.,b.FROM city as a FULL OUTER JOIN user as b ON a.username=b.username
全外连接:包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。交叉连接:生成笛卡尔积一它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配