Mysql日常总结(一)
事务的隔离级别的分类
(1)读未提交(Read uncommitted),一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证。
(2)读已提交(Read committed),一个事务要等另一个事务提交后才能读取数据,可避免脏读的发生。
(3)可重复读(Repeatable read),就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发生。
(4)串行(Serializable),是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
Mysql的默认隔离级别是可重复读(Repeatable read)。
脏读、不可重复读和幻读的区别
脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据;
不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时数据结果会不一致;
幻读:幻读解决了不可重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性);
InnoDB引擎的4大特性
(1)插入缓冲(insert buffer);(2)二次写(double write);(3)自适应哈希索引(ahi);(4)预读(read ahead)。
Mysql中的myisam与innodb的区别
(1)InnoDB支持事务,而MyISAM不支持事务;
(2)InnoDB支持行级锁,而MyISAM支持表级锁;
(3)InnoDB支持MVCC,而MyISAM不支持;
(4)InnoDB支持外键,而MyISAM不支持;
(5)InnoDB不支持全文索引,而MyISAM支持;
(6)InnoDB不能通过直接拷贝表文件的方法拷贝表到另外一台机器, myisam 支持;(7)InnoDB表支持多种行格式, myisam 不支持;
(8)InnoDB是索引组织表, myisam 是堆表;
sql语句优化的方式,至少五种
(1)避免使用select *,而是将需要查找的字段列出来进行查询;
(2)使用连接(join)来代替子查询;
(3)拆分大的delete或insert语句;
(4)使用limit对查询结果的记录进行限定;
(5)用 exists 代替 in 是一个好的选择;
(6)不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引
(7)尽量避免在where 子句中对字段进行 null 值判断、使用 or 来连接条件和使用!=或<>操作符,否则将导致引擎放弃使用索引而进行全表扫描;
表结构优化,至少五种
(1)永远为每张表设置一个ID;
(2)选择正确的存储引擎 ;
(3)使用可存下数据的最小的数据类型;
(4)使用简单的数据类型,整型比字符串处理开销更小,因为字符串的比较更复杂。
(5)使用合理的字段属性长度,固定长度的表会更快。
(6)使用enum、char而不是varchar;
(7)尽可能使用not null定义字段(给空字段设置默认值);
(8)尽量少用text;
(9)给频繁使用和查询的字段建立合适的索引;
union、union all的区别
(1)对重复结果的处理:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录;
(2)对排序的处理:Union将会按照字段的顺序进行排序;UNION ALL只是简单的将两个结果合并后就返回;
(3)从效率上说,UNION ALL 要比UNION快很多。
什么是存储过程?用什么来调用?
存储过程是一个预编译的SQL 语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL ,使用存储过程比单纯SQL 语句执行要快。可以用一个命令对象来调用存储过程。
什么是触发器?触发器的作用?
触发器是比较特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作,从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。
存储过程与触发器的区别
触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。
通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。
触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQL SERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。
索引的作用和其优缺点
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。
索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的大小。
什么是外键,其优缺点是什么?
外键指的是外键约束,目的是保持数据一致性,完整性,控制存储在外键表中的数据。使两张表形成关联,外键只能引用外表中列的值;
优点:由数据库自身保证数据一致性,完整性,更可靠,因为程序很难100%保证数据的完整性,而用外键即使在数据库服务器当机或者出现其他问题的时候,也能够最大限度的保证数据的一致性和完整性。有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时非常重要。外键在一定程度上说明的业务逻辑,会使设计周到具体全面。缺点:可以用触发器或应用程序保证数据的完整性;过分强调或者说使用外键会平添开发难度,导致表过多,更改业务困难,扩展困难等问题;不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快)。
什么叫视图?游标是什么?
视图是一种虚拟的表,具有和物理表相同的功能;可以对视图进行增,改,查等操作,但是主要是为了查询。视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。相比多表查询,它使得我们获取数据更容易和迅速。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。