MySQL专题<1>
⼀.标准SQL规范中定义的四个事务隔离级别
数据库操作⾯临的问题:脏读、不可重复读、幻读、更新丢失。
脏读
指⼀个事务读取了另⼀个事务未提交的记录。当⼀个事务正在访问数据,并且对数据进⾏了修改,⽽这种修改还没有提交到数据库中;另外⼀个事务也访问这个数据,然后使⽤了这个未提交的数据。因为这个数据还没有提交,那么第⼆个事务读取到的是脏数据,依据脏数据所做的操作可能是不正确的。
不可重复读
指在⼀个事务内,多次重复执⾏某个查询,返回的记录不⼀致。例如:在⼀个事务还没有结束时,另外⼀个事务修改了该数据;在第⼀个事务中的两次读数据之间,由于第⼆个事务的修改,导致两次读取到的数据可能是不⼀样的。这样就发⽣了在⼀个事务内两次读到的数据是不⼀样的,因此称为是不可重复读。
幻读
指当事务不是独⽴执⾏时发⽣的⼀种现象,例如:第⼀个事务对表中的数据进⾏了批量修改(status=2);同时第⼆个事务也修改这个表中的数据,向表中插⼊⼀⾏新数据(status=1),插⼊的数据刚好满⾜第⼀个事务的修改条件;操作第⼀个事务的⽤户发现表中还存在没有修改的数据⾏(status=1),就好象发⽣了幻觉⼀样。
更新丢失
两个事务都同时更新⼀⾏数据,⼀个事务对数据的更新把另⼀个事务对数据的更新覆盖了。这是因为系统没有执⾏任何的锁操作,因此并发事务并没有被隔离开来。
对应的事物隔离级别:
为了避免上⾯出现的⼏种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
读未提交
读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果⼀个事务已经开始写数据,则另外⼀个事务则不允许同时进⾏写操作,但允许其他事务读此⾏数据。该隔离级别可以通过“排他写锁”实现。
读已提交
读已提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该⾏数据,但是未提交的写事务将会禁⽌其他事务访问该⾏。
可重复读取(Repeatable Read)
可重复读取(Repeatable Read):禁⽌不可重复读取和脏读取,但是有时可能出现幻读数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁⽌写事务(但允许读事务),写事务则禁⽌任何其他事务。
串⾏操作(Serializable)
串⾏化(Serializable):提供严格的事务隔离。它要求事务串⾏化执⾏,事务只能⼀个接着⼀个地执⾏,不能并发执⾏。仅仅通过“⾏级锁”是⽆法实现事务序列化的,必须通过其他机制保证新插⼊的数据不会被刚执⾏查询操作的事务访问到。
隔离级别越⾼,越能保证数据的完整性和⼀致性,但是对并发性能的影响也越⼤。对于多数应⽤程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,⽽且具有较好
的并发性能。尽管它会导致不可重复读、幻读和第⼆类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应⽤程序采⽤悲观锁或乐观锁来控制。
⼆.MySQL存储引擎MyISAM与InnoDB区别总结整理
1、MySQL默认存储引擎的变迁
在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。
2、MyISAM与InnoDB存储引擎的主要特点
MyISAM存储引擎的特点是:表级锁、不⽀持事务和全⽂索引,适合⼀些CMS内容管理系统作为后台数据库使⽤,但是使⽤⼤并发、重负荷⽣产系统上,表锁结构的特性就显得⼒不从⼼;
InnoDB存储引擎的特点是:⾏级锁、事务安全(ACID兼容)、⽀持外键、不⽀持FULLTEXT类型的索引(5.6.4以后版本开始⽀持FULLTEXT类型的索引)。InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能⼒的事务安全存储引擎。InnoDB是为处理巨⼤量时拥有最⼤性能⽽设计的。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB表的⾏锁也不是绝对的,假如在执⾏⼀个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如
update table set num=1where name like “a%”。
两种类型最主要的差别就是InnoDB⽀持事务处理与外键和⾏级锁。⽽MyISAM不⽀持。所以MyISAM往往就容易被⼈认为只适合在⼩项⽬中使⽤。
forward是什么意思中文翻译3、MyISAM与InnoDB性能测试
随着CPU核数的增加,InnoDB的吞吐量反⽽越好,⽽MyISAM,其吞吐量⼏乎没有什么变化,显然,MyISAM的表锁定机制降低了读和写的吞吐量。
4、事务⽀持与否
radius是什么意思英语MyISAM是⼀种⾮事务性的引擎,使得MyISAM引擎的MySQL可以提供⾼速存储和检索,以及全⽂搜索能⼒,适合数据仓库等查询频繁的应⽤;
InnoDB是事务安全的;
事务是⼀种⾼级的处理⽅式,如在⼀些列增删改中只要哪个出错还可以回滚还原,⽽MyISAM就不可以了。
5、MyISAM与InnoDB构成上的区别
(1)每个MyISAM在磁盘上存储成三个⽂件:
第⼀个⽂件的名字以表的名字开始,扩展名指出⽂件类型,.frm⽂件存储表定义。
第⼆个⽂件是数据⽂件,其扩展名为.MYD (MYData)。
第三个⽂件是索引⽂件,其扩展名是.MYI (MYIndex)。
(2)基于磁盘的资源是InnoDB表空间数据⽂件和它的⽇志⽂件,InnoDB 表的 ⼤⼩只受限于操作系统⽂件的⼤⼩,⼀般为 2GB。
6、MyISAM与InnoDB表锁和⾏锁的解释
MySQL表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。什么意思呢,就是说对MyISAM表进⾏读操作时,它不会阻塞其他⽤户对同⼀表的读请求,但会阻塞对同⼀表的写操作;⽽对MyISAM表的写操作,则会阻塞其他⽤户对同⼀表的读和写操作。
InnoDB⾏锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,InnoDB才使⽤⾏级锁,否则将使⽤表锁!⾏级锁在每次获取锁和释放锁的操作需要消耗⽐表锁更多的资源。在InnoDB两个事务发⽣死锁的时候,会计算出每个事务影响的⾏数,然后回滚⾏数少的那个事务。当锁定的场景中不涉及Innodb的时候,InnoDB是检测不到的。只能依靠锁定超时来解决。
7.1 MySQL 中 InnoDB 引擎的⾏锁是通过加在什么上完成(或称实现)的?
InnoDB ⾏锁是通过给索引上的索引项加锁来实现的,这⼀点 MySQL 与Oracle 不同,后者是通过在数据块中对相应数据⾏加锁来实现的。InnoDB 这种⾏锁实现特点意味着:只有通过索引条件检索数据,InnoDB 才使⽤⾏级锁,否则,InnoDB 将使⽤表锁!
7、是否保存数据库表中表的具体⾏数
InnoDB 中不保存表的具体⾏数,也就是说,执⾏select count(*) from table 时,InnoDB要扫描⼀遍整个表来计算有多少⾏,但是MyISAM只要简单的读出保存好的⾏数即可。
注意的是,当count(*)语句包含where条件时,两种表的操作是⼀样的。也就是 上述“6”中介绍到的InnoDB使⽤表锁的⼀种情况。
8、如何选择
MyISAM适合:
(1)做很多count 的计算;
(2)插⼊不频繁,查询⾮常频繁,如果执⾏⼤量的SELECT,MyISAM是更好的选择;
(3)没有事务。
InnoDB适合:
(1)可靠性要求⽐较⾼,或者要求事务;
(2)表更新和查询都相当的频繁,并且表锁定的机会⽐较⼤的情况指定数据引擎的创建;
mysql面试题acid
(3)如果你的数据执⾏⼤量的INSERT或UPDATE,出于性能⽅⾯的考虑,应该使⽤InnoDB表;
(4)DELETE FROM table时,InnoDB不会重新建⽴表,⽽是⼀⾏⼀⾏的 删除;
(5)LOAD TABLE FROM MASTER操作对InnoDB是不起作⽤的,解决⽅法是⾸先把InnoDB表改成MyISAM表,导⼊数据后再改成InnoDB表,但是对于使⽤的额外的InnoDB特性(例如外键)的表不适⽤。
要注意,创建每个表格的代码是相同的,除了最后的 TYPE参数,这⼀参数⽤来指定数据引擎。
其他区别:
1、对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段⼀起建⽴联合索引。
2、DELETE FROM table时,InnoDB不会重新建⽴表,⽽是⼀⾏⼀⾏的删除。
3、LOAD TABLE FROMMASTER操作对InnoDB是不起作⽤的,解决⽅法是⾸先把InnoDB表改成MyISAM表,导⼊数据后再改成InnoDB表,但是对于使⽤的额外的InnoDB特性(例如外键)的表不适⽤。
4、 InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引⽽维持它⾃⼰的缓冲池。
5、对于⾃增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段⼀起建⽴联合索引。
6、清空整个表时,InnoDB是⼀⾏⼀⾏的删除,效率⾮常慢。MyISAM则会重建表。
三。 MYSQL数据库服务器性能分析的⽅法命令有哪些?
四.MySQL常⽤函数⼤全(总结篇)
五.唯⼀索引⽐普通索引快吗, 为什么?
唯⼀索引不⼀定⽐普通索引快, 还可能慢。
查询时, 在未使⽤limit 1的情况下, 在匹配到⼀条数据后, 唯⼀索引即返回, 普通索引会继续匹配下⼀条数据, 发现不匹配后返回. 如此看来唯⼀索引少了⼀次匹配, 但实际上这个消耗微乎其微.
更新时, 这个情况就⽐较复杂了. 普通索引将记录放到change buffer中语句就执⾏完毕了. ⽽对唯⼀索引⽽⾔, 它必须要校验唯⼀性, 因此,
必须将数据页读⼊内存确定没有冲突, 然后才能继续操作. 对于 写多读少的情况, 普通索引利⽤change buffer有效减少了对磁盘的访问次数,因此普通索引性能要⾼于唯⼀索引.
六.MySQL由哪些部分组成, 分别⽤来做什么
Server
连接器: 管理连接, 权限验证.
分析器: 词法分析, 语法分析.
优化器: 执⾏计划⽣成, 索引的选择.
执⾏器: 操作存储引擎, 返回执⾏结果.
存储引擎: 存储数据, 提供读写接⼝.
七.MySQL怎么恢复半个⽉前的数据
通过整库备份+binlog进⾏恢复. 前提是要有定期整库备份且保存了binlog⽇志.
⼋.MySQL事务的隔离级别, 分别有什么特点
读未提交(RU): ⼀个事务还没提交时, 它做的变更就能被别的事务看到.
读提交(RC): ⼀个事务提交之后, 它做的变更才会被其他事务看到.
可重复读(RR): ⼀个事务执⾏过程中看到的数据, 总是跟这个事务在启动时看到的数据是⼀致的. 当然在可重复读隔离级别下, 未提交变更对其他事务也是不可见的.
串⾏化(S): 对于同⼀⾏记录, 读写都会加锁. 当出现读写锁冲突的时候, 后访问的事务必须等前⼀个事务执⾏完成才能继续执⾏.
九.MySQL索引详细介绍
⼗.MySQL中的索引的存储类型BTREE、HASH
做过哪些MySQL索引相关优化
尽量使⽤主键查询: 聚簇索引上存储了全部数据, 相⽐普通索引查询, 减少了回表的消耗.二进制算法例子
MySQL5.6之后引⼊了索引下推优化, 通过适当的使⽤联合索引, 减少回表判断的消耗.
若频繁查询某⼀列数据, 可以考虑利⽤覆盖索引避免回表.
联合索引将⾼频字段放在最左边.
⼗⼀.简要说⼀下数据库范式
第⼀范式:字段的原⼦性:
简单来说就是每⼀个字段不能分割出其他的属性
  确保每列的原⼦性
  如果每列(或者每个属性)都是不可再分的最⼩数据单元(也称为最⼩的原⼦单元),则满⾜第⼀范式. 
  例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等。
第⼆范式:保证主键的唯⼀性,属性完全依赖于主键
  在第⼀范式的基础上更进⼀层,⽬标是确保表中的每列都和主键相关
  如果⼀个关系满⾜第⼀范式,并且除了主键以外的其它列,都依赖于该主键,则满⾜第⼆范式.
  例如:订单表(订单编号、产品编号、定购⽇期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接 的关系,即"产品编号"列不依赖于主键列,应删除该列。
第三范式:消除传递依赖,保证每个属性都直接依赖于主键
  在第⼆范式的基础上更进⼀层,⽬标是确保每列都和主键列直接相关,⽽不是间接相关
excel代码编写大全
  如果⼀个关系满⾜第⼆范式,并且除了主键以外的其它列都不依赖于主键列,则满⾜第三范式。
  为了理解第三范式,需要根据Armstrong公⾥之⼀定义传递依赖。假设A、B和C是关系R的三个属性,如果A-〉B且B-〉C,则从这些函数依赖中,可以得出A-〉C, 如上所述,依赖A-〉C是传递依赖。
⼗⼆.⼀千万条数据的表, 如何分页查询
数据量过⼤的情况下, limit offset分页会由于扫描数据太多⽽越往后查询越慢. 可以配合当前页最后⼀条ID进⾏查询, SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT}. 当然, 这种情况下ID必须是有序的, 这也是有序ID的好处之⼀.
订单表数据量越来越⼤导致查询缓慢, 如何处理
分库分表. 由于历史订单使⽤率并不⾼, ⾼频的可能只是近期订单, 因此, 将订单表按照时间进⾏拆分, 根据数据量的⼤⼩考虑按⽉分表或按年分表. 订单ID最好包含时间(如根据雪花算法⽣成), 此时既能根据订单ID直接获取到订单记录, 也能按照时间进⾏查询。
⼗三.有哪些数据库优化⽅⾯的经验?
1.⽤ PreparedStatement, ⼀般来说⽐ Statement 性能⾼:⼀个 sql发给服务器去执⾏,涉及步骤:语法检查、语义分析, 编译,缓存。
2.有外键约束会影响插⼊和删除性能,如果程序能够保证数据的完整性, 那在设计数据库时就去掉外键。
3.表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
4.UNION ALL 要⽐ UNION 快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使⽤ UNION ALL。
5.避免使⽤ NULL,NULL 需要特殊处理, ⼤多数时候应该使⽤ NOT NULL,或者使⽤⼀个特殊的值,如 0,-1 作为默认值。
6.仅可能使⽤更⼩的字段,MySQL 从磁盘读取数据后是存储到内存中的,然后使⽤ cpu 周期和磁盘 I/O 读取它,这意味着越⼩的数据类型占⽤的空间越⼩.
UNION 和 UNION ALL 关键字都是将两个结果集合并为⼀个,但这两者从使⽤和效率上来说都有所不同。
1. 对重复结果的处理:UNION 在进⾏表链接后会筛选掉重复的记录,Union All 不会去除重复记录。
2. 对排序的处理:Union 将会按照字段的顺序进⾏排序;UNION ALL 只是简单的将两个结果合并后就返回。
⼗四.MySQL 的基础操作命令:
1.MySQL 是否处于运⾏状态:Debian 上运⾏命令 service mysql status,在 RedHat 上运⾏命令 service mysqld status
2.开启或停⽌ MySQL 服务 :运⾏命令 service mysqld start 开启服务;运⾏命令 service mysqld stop 停⽌服务
3.Shell 登⼊ MySQL: 运⾏命令 mysql -u root -p
4.列出所有数据库:运⾏命令 show databases;
5.切换到某个数据库并在上⾯⼯作:运⾏命令 use databasename; 进⼊名为 databasename 的数据库
6.列出某个数据库内所有表: show tables;
7.获取表内所有 Field 对象的名称和类型 :describe table_name;
⼗五.mysql 的复制原理以及流程。
Mysql 内建的复制功能是构建⼤型,⾼性能应⽤程序的基础。将 Mysql 的数据分布到多个系统上去,
这种分布的机制,是通过将 Mysql
的某⼀台主机的数据复制到其它主机(slaves)上,并重新执⾏⼀遍来实现的。 * 复制过程中⼀个服务器充当主服务器,⽽⼀个或多个其它服务器充当从服务器。主服务器将更新写⼊⼆进制⽇志⽂件,并维护⽂件的⼀个索引以跟踪⽇志循环。这些⽇志可以记录发送到从服务器的更新。 当⼀个从服务器连接主服务器时,它通知主服务器在⽇志中读取的最后⼀次成功更新的位置。从服务器接收从那时起发⽣的任何更新,然后封锁并等待主服务器通知新的更新。 过程如下 1. 主服务器把更新记录到⼆进制⽇志⽂件中。 2. 从服务器把主服务器的⼆进制⽇志拷贝到⾃⼰的中继⽇志(replay log)中。 3. 从服务器重做中继⽇志中的时间, 把更新应⽤到⾃⼰的数据库上。
mysql ⽀持的复制类型?
1.基于语句的复制: 在主服务器上执⾏的 SQL 语句,在从服务器上执⾏同样的语句。MySQL 默认采⽤基于语句的复制,效率⽐较⾼。 ⼀旦发现没法精确复制时,会⾃动选着基于⾏的复制。
2.基于⾏的复制:把改变的内容复制过去,⽽不是把命令在从服务器上执⾏⼀遍. 从 mysql5.0 开始⽀持
3.混合类型的复制: 默认采⽤基于语句的复制,⼀旦发现基于语句的⽆法精确的复制时,就会采⽤基于⾏的复制。
mysql 中 varchar 与 char 的区别以及 varchar(50)中的 50 代表的涵义?
programfiles可以删吗
1.varchar 与 char 的区别: char 是⼀种固定长度的类型,varchar 则是⼀种可变长度的类型.
2.varchar(50)中 50 的涵义 : 最多存放 50 个字节
3.int(20)中 20 的涵义: int(M)中的 M indicates the maximum display width (最⼤显⽰宽度)for integer types. The maximum legal display width is 255.
表中有⼤字段 X(例如:text 类型),且字段 X 不会经常更新,以读为为主,将该字段拆成⼦表好处是什么?
如果字段⾥⾯有⼤字段(text,blob)类型的,⽽且这些字段的访问并不多,这时候放在⼀起就变成缺点了。 MYSQL 数据库的记录存储是按⾏存储的,数据块⼤⼩⼜是固定的(16K),每条记录越⼩,相同的块存储的记录就越多。此时应该把⼤字段拆⾛,这样应付⼤部分⼩字段的查询时,就能提⾼效率。当需要查询⼤字段时,此时的关联查询是不可避免的,但也是值得的。拆分开后, 对字段的 UPDAE 就要UPDATE 多个表了
MySQL 中控制内存分配的全局参数,有哪些?
1.Keybuffersize:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。