史上最全MySQL⾯试题及答案
1.事务的基本特征
原⼦性(atomicity):⼀个事务必须视为⼀个不可分割的最⼩⼯作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于⼀个事务来说,不可能只执⾏其中的⼀部分操作,这就是事务的原⼦性。
⼀致性(consistency):数据库总数从⼀个⼀致性的状态转换到另⼀个⼀致性的状态。
隔离性(isolation):⼀个事务所做的修改在最终提交以前,对其他事务是不可见的。
持久性(durability):⼀旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
2.事务的隔离级别,mysql默认的隔离级别是什么?
读未提交(Read uncommitted),⼀个事务可以读取另⼀个未提交事务的数据,最低级别,任何情况都⽆法保证。
读已提交(Read committed),⼀个事务要等另⼀个事务提交后才能读取数据,可避免脏读的发⽣。
可重复读(Repeatable read),就是在开始读取数据(事务开启)时,不再允许修改操作,可避免脏读、不可重复读的发⽣。
串⾏(Serializable),是最⾼的事务隔离级别,在该级别下,事务串⾏化顺序执⾏,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,⽐较耗数据库性能,⼀般不使⽤。Mysql的默认隔离级别是Repeatable read。
3.说⼀说脏读、不可重复读、幻读
脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据;
不可重复读:事务 A 多次读取同⼀数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同⼀数据时,结果因此本事务先后两次读到的数据结果会不⼀致;
幻读:幻读解决了不重复读,保证了同⼀个事务⾥,查询的结果都是事务开始时的状态(⼀致性);
4.数据表类型有哪些
MyIASM、InnoDB、HEAP、ISAM、MERGE、DBD以及Gemeni(⼀般只知道前两者即可)
5.innodb引擎的4⼤特性
插⼊缓冲(insert buffer);⼆次写(double write);⾃适应哈希索引(ahi);预读(read ahead)
6.InnoDB引擎的⾏锁是通过加在什么上实现的?
基于索引;
7.Mysql中的myisam与innodb的区别,⾄少五点
InooDB⽀持事务,⽽MyISAM不⽀持事务;
InnoDB⽀持⾏级锁,⽽MyISAM⽀持表级锁;
InnoDB⽀持MVCC,⽽MyISAM不⽀持;
InnoDB⽀持外键,⽽MyISAM不⽀持;
InnoDB不⽀持全⽂索引,⽽MyISAM⽀持;
InnoDB不能通过直接拷贝表⽂件的⽅法拷贝表到另外⼀台机器, myisam ⽀持;
InnoDB表⽀持多种⾏格式, myisam 不⽀持;
InnoDB是索引组织表, myisam 是堆表;
myisam更快,因为myisam内部维护了⼀个计数器,可以直接调取。
9.数据库三⼤范式
第⼀范式:数据库表中的字段都是单⼀属性的,不可再分(保持数据的原⼦性);
第⼆范式:第⼆范式必须符合第⼀范式,⾮主属性必须完全依赖于主键。
第三范式:在满⾜第⼆范式的基础上,在实体中不存在其他实体中的⾮主键属性,传递函数依赖于主键属性,确保数据表中的每⼀列数据都和主键直接相关,⽽不能间接相关(表中字段[⾮主键]不存在对主键的传递依赖)
10.说⼀说你能想到的sql语句优化,⾄少五种
电影源代码原著避免select *,将需要查的字段列出来;
使⽤连接(join)来代替⼦查询;
拆分⼤的delete或insert语句;
使⽤limit对查询结果的记录进⾏限定;
⽤ exists 代替 in 是⼀个好的选择;
⽤Where⼦句替换HAVING ⼦句 因为HAVING 只会在检索出所有记录之后才对结果集进⾏过滤;
不要在 where ⼦句中的“=”左边进⾏函数、算术运算或其他表达式运算,否则系统将可能⽆法正确使⽤索引尽量避免在where ⼦句中对字段进⾏ null 值判断,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描
尽量避免在 where ⼦句中使⽤ or 来连接条件,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描;
尽量避免在 where ⼦句中使⽤!=或<>操作符,否则将引擎放弃使⽤索引⽽进⾏全表扫描;
11.说⼀说你能想到的表结构优化,⾄少五种永远为每张表设置⼀个ID
(所有建表的时候不设置主键的程序猿都应该被辞退);选择正确的存储引擎 ;
使⽤可存下数据的最⼩的数据类型,整型 < date,time < char,varchar < blob;
access vba教程完整版
使⽤简单的数据类型,整型⽐字符处理开销更⼩,因为字符串的⽐较更复杂。如,int类型存储时间类型,bigint类型转ip函数;
使⽤合理的字段属性长度,固定长度的表会更快。
使⽤enum、char⽽不是varchar;
尽可能使⽤not null定义字段(给空字段设置默认值);
尽量少⽤text;给频繁使⽤和查询的字段建⽴合适的索引;
12.说⼏个mysql中你常⽤的函数
sum、count 、avg、min、max
13.说⼏个你除了增删改查之外在mysql中常⽤的命令
Explain、describe、show、truncate
14.说⼏个除了增删改查之外常⽤的关键字答
distinct、limit、offset、order by、union、union all、between、group by;
15.union、union all的区别
mysql无法连接到服务器对重复结果的处理:UNION在进⾏表链接后会筛选掉重复的记录,Union All不会去除重复记录;
对排序的处理:Union将会按照字段的顺序进⾏排序;UNION ALL只是简单的将两个结果合并后就返回;
从效率上说,UNION ALL 要⽐UNION快很多
16.varchar(100)和varchar(200)的区别
varchar(100)最多存放100个字符
varchar(200)最多存放200个字符
varchar(100)和(200)存储hello所占空间⼀样,但后者在排序时会消耗更多内存,因为order by col采⽤fixed_length计算col长度(memory引擎也⼀样)
17.varchar(20)和int(20)中的20含义⼀样吗
不⼀样,前者表⽰最多存放20个字符,后者表⽰最多显⽰20个字符,但是存储空间还是占4字节存储,
存储范围不变;
18.什么是存储过程?⽤什么来调⽤
存储过程是⼀个预编译的SQL 语句,优点是允许模块化的设计,就是说只需创建⼀次,以后在该程序中就可以调⽤多次。如果某次操作需要执⾏多次SQL ,使⽤存储过程⽐单纯SQL 语句执⾏要快。可以⽤⼀个命令对象来调⽤存储过程。
19.什么是触发器?触发器的作⽤?
触发器是⼀中特殊的存储过程,主要是通过事件来触发⽽被执⾏的。它可以强化约束,来维护数据的完整性和⼀致性,可以跟踪数据库内的操作从⽽不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另⼀个表的数据操作,⽽该操作⼜会导致该表触发器被触发。
20.存储过程与触发器的区别
触发器与存储过程⾮常相似,触发器也是SQL语句集,两者唯⼀的区别是触发器不能⽤EXECUTE语句调⽤,⽽是在⽤户执⾏Transact-SQL语句时⾃动触发(激活)执⾏。触发器是在⼀个修改了指定表中的数据时执⾏的存储过程。通常通过创建触发器来强制实现不同表中的逻辑相关数据的引⽤完整性和⼀致性。由于⽤户不能绕过触发器,所以可以⽤它来强制实施复杂的业务规则,以确保数据的完整
性。触发器不同于存储过程,触发器主要是通过事件执⾏触发⽽被执⾏的,⽽存储过程可以通过存储过程名称名字⽽直接调⽤。当对某⼀表进⾏诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会⾃动执⾏触发器所定义的SQL语句,从⽽确保对数据的处理必须符合这些SQL语句所定义的规则。
21.索引的作⽤?和它的优点缺点是什么?
索引就⼀种特殊的查询表,数据库的搜索引擎可以利⽤它加速对数据的检索。它很类似与现实⽣活中书的⽬录,不需要查询整本书内容就可以到想要的数据。索引可以是唯⼀的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录⼊的速度,同时也增加了数据库的尺⼨⼤⼩。
22.MySQL主要的索引类型
普通索引:是最基本的索引,它没有任何限制;
唯⼀索引:索引列的值必须唯⼀,但允许有空值。如果是组合索引,则列值的组合必须唯⼀;
主键索引:是⼀种特殊的唯⼀索引,⼀个表只能有⼀个主键,不允许有空值;
组合索引:指多个字段上创建的索引,只有在查询条件中使⽤了创建索引时的第⼀个字段,索引才会被使⽤。使⽤组合索引时遵循最左前缀集合;
全⽂索引:主要⽤来查⽂本中的关键字,⽽不是直接与索引中的值相⽐较,mysql中MyISAM⽀持全⽂索引⽽InnoDB不⽀持;23.使⽤like ‘a%’ 、like’%a’、like’%a%'查询时是否会使⽤索引
'a%'会,其他两个不会
24.使⽤索引注意事项
mysql配置参数详解索引不会包含有NULL的列,复合索引中只要有⼀列含有NULL值,那么这⼀列对于此符合索引就是⽆效的;使⽤短索引,对串列进⾏索引,如果可以就应该指定⼀个前缀长度;短索引不仅可以提⾼查询速度⽽且可以节省磁盘空间和I/O操作;mysql查询只使⽤⼀个索引,因此数据库默认排序可以符合要求的情况下不要使⽤排序操作,尽量不要包含多个列的排序,如果需要最好给这些列建复合索引;注意like,上⽂已经提到;不要在列上进⾏运算;不使⽤NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以⽤到索引的;索引要建⽴在经常进⾏select操作的字段上;索引要建⽴在值⽐较唯⼀的字段上;对于那些定义为text、image和bit数据类型的列不应该增加索引;在where和join中出现的列需要建⽴索引;如果where字句的查询条件⾥使⽤了函数(如:where DAY(column)=…),mysql将⽆法使⽤索引;在join操作中(需要从多个数据表提取数据时),mysql只有在主键和外键的数据类型相同时才能使⽤索引,否则及时建⽴了索引也不会使⽤;
25.说⼀说什么是外键,优缺点
外键指的是外键约束,⽬的是保持数据⼀致性,完整性,控制存储在外键表中的数据。使两张表形成关联,外键只能引⽤外表中列的值;优点:由数据库⾃⾝保证数据⼀致性,完整性,更可靠,因为程序很难100%保证数据的完整性,⽽⽤外键即使在数据库服务器当机或者出现其他问题的时候,也能够最⼤限度的保证数据的⼀致性和完整性。有主外键的数据库设计可以增加ER图的可读性,这点在数据库设计时⾮常重要。外键在⼀定程度上说明的业务逻辑,会使设计周到具体全⾯。缺点:可以⽤触发器或应⽤程序保证数据的完整性;过分强调或者说使⽤外键会平添开发难度,导致表过多,更改业务困难,扩展困难等问题;不⽤外键时数据管理简单,操作⽅便,性能⾼(导⼊导出等操作,在insert, update, delete 数据的时候更快);
26.在什么时候你会选择使⽤外键,为什么
在我的业务逻辑⾮常简单,业务⼀旦确定不会轻易更改,表结构简单,业务量⼩的时候我会选择使⽤外键。因为当不符合以上条件的时候,外键会影响业务的扩展和修改,当数据量庞⼤时,会严重影响增删改查的效率。
27.什么叫视图?游标是什么
视图是⼀种虚拟的表,具有和物理表相同的功能;可以对视图进⾏增,改,查,操作,视图通常是有⼀个表或者多个表的⾏或列的⼦集。对视图的修改不影响基本表。它使得我们获取数据更容易,相⽐
多表查询。游标:是对查询出来的结果集作为⼀个单元来有效的处理。游标可以定在该单元中的特定⾏,从结果集的当前⾏检索⼀⾏或多⾏。可以对结果集当前⾏做修改。⼀般不使⽤游标,但是需要逐条处理数据的时候,游标显得⼗分重要。
没有,InnoDB如果没有定义主键,内部会⽣成⼀个主键编号rowid ,但是⽆法查询到。在平时InnoDB建表的时候我们最好⾃⼰确定主键,防⽌每次插⼊数据前数据库会去⽣成rowid。
set @i=0;SELECT (@i:=@i+1) 别名 FROM table, (SELECT @i:=0) AS 别名 ;
30.如何使⽤explain优化sql和索引?
explain sql ;table:显⽰这⼀⾏的数据是关于哪张表的;type:这是重要的列,显⽰连接使⽤了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL;all: full table scan ;MySQL将遍历全表以到匹配的⾏;index : index scan; index 和all的区别在于index类型只遍历索引;range:索引范围扫描,对索引的扫描开始于某⼀点,返回匹配值的⾏,常见与between ,< ,>等查询;ref:⾮唯⼀性索引扫描,返回匹配某个单独值的所有⾏,常见于使⽤⾮唯⼀索引即唯⼀索引的
⾮唯⼀前缀进⾏查;eq_ref:唯⼀性索引扫描,对于每个索引键,表中只有⼀条记录与之匹配,常⽤于主键或者唯⼀索引扫描;const,system:当MySQL对某查询某部分进⾏优化,并转为⼀个常量时,使⽤这些访问类型;如果将主键置于where列表中,MySQL就能将该查询转化为⼀个常量;
possible_keys:显⽰可能应⽤在这张表中的索引;如果为空,没有可能的索引;可以为相关的域从WHERE语句中选择⼀个合适的语句;key: 实际使⽤的索引;如果为NULL,则没有使⽤索引;很少的情况下,MySQL会选择优化不⾜的索引;这种情况下,可以在SELECT 语句中使⽤USE INDEX(indexname)来强制使⽤⼀个索引或者⽤IGNORE INDEX(indexname)来强制MySQL忽略索引key_len:使⽤的索引的长度;在不损失精确性的情况下,长度越短越好;ref:显⽰索引的哪⼀列被使⽤了,如果可能的话,是⼀个常数;rows:MySQL认为必须检查的⽤来返回请求数据的⾏数;Extra:关于MySQL如何解析查询的额外信息;
31.数据库三范式是什么?
第⼀范式(1NF):字段具有原⼦性,不可再分。(所有关系型数据库系 统都满⾜第⼀范式数据库表中的字段都是单⼀属性的,不可再分)
第⼆范式(2NF)是在第⼀范式(1NF)的基础上建⽴起来的,即满⾜ 第⼆范式(2NF)必须先满⾜第⼀范式(1NF)。要求数据库表中的每 个实例或⾏必须可以被惟⼀地区分。通常需要为表加上⼀个
列,以存储 各个实例的惟⼀标识。这个惟⼀属性列被称为主关键字或主键
满⾜第三范式(3NF)必须先满⾜第⼆范式(2NF)。简⽽⾔之,第三 范式(3NF)要求⼀个数据库表中不包含已在其它表中已包含的⾮主关 键字信息。 >所以第三范式具有如下特征:
1. 每⼀列只有⼀个 值
2. 每⼀⾏都能区分
3. 每⼀个表都不包含其他表已经包含 的⾮主关键字信息。oracle获取系统当前时间
32.有哪些数据库优化⽅⾯的经验?
⽤ PreparedStatement, ⼀般来说⽐ Statement 性能⾼:⼀个 sql 发给服务器去执⾏,涉及步骤:语法检查、语义分析, 编译,缓存
有外键约束会影响插⼊和删除性能,如果程序能够保证数据的完整性, 那在设计数据库时就去掉外键网络编程与设计技术是什么
表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
UNION ALL 要⽐ UNION 快很多,所以,如果可以确认合并的两个结 果集中不包含重复数据且不需要
排序时的话,那么就使⽤UNION ALL。 >>UNION 和 UNION ALL 关键字都是将两个结果集合并为⼀ 个,但这两者从使⽤和效率上来说都有所不同。 >1. 对重复结果的处 理:UNION 在进⾏表链接后会筛选掉重复的记录,Union All 不会去除 重复记录。 >2. 对排序的处理:Union 将会按照字段的顺序进⾏排 序;UNION ALL 只是简单的将两个结果合并后就返回。
33.请简述常⽤的索引有哪些种类?
普通索引: 即针对数据库表创建索引
唯⼀索引: 与普通索引类似,不同的就是:MySQL 数据库索引列的值 必须唯⼀,但允许有空值
主键索引: 它是⼀种特殊的唯⼀索引,不允许有空值。⼀般是在建表的 时候同时创建主键索引
组合索引: 为了进⼀步榨取 MySQL 的效率,就要考虑建⽴组合索引。 即将数据库表中的多个字段联合起来作为⼀个组合索引。34.以及在 mysql 数据库中索引的⼯作机制是什么?
数据库索引,是数据库管理系统中⼀个排序的数据结构,以协助快速查询、更 新数据库表中数据。索引的实现通常使⽤ B 树及其变种
B+树
35.MySQL 的基础操作命令:
MySQL 是否处于运⾏状态:Debian 上运⾏命令 service mysql status,在 RedHat 上运⾏命令 service mysqld status
开启或停⽌ MySQL 服务 :运⾏命令 service mysqld start 开启服 务;运⾏命令 service mysqld stop 停⽌服务
Shell 登⼊ MySQL: 运⾏命令 mysql -u root -p;
列出所有数据库:运⾏命令 show databases;
切换到某个数据库并在上⾯⼯作:运⾏命令 use databasename; 进⼊ 名为 databasename 的数据库
列出某个数据库内所有表: show tables;
获取表内所有 Field 对象的名称和类型 :describe table_name;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论