公众号:尤而小屋
编辑:Peter 作者:caokegege
大众好,我是Peter~
今天给大众分享一份MySQL面试的52道经典题目,意见保藏~
1.Mysql中有哪几种锁?表级锁:开销小,加锁快;不会显现死锁;锁定粒度大,出现锁冲突的概率最高,并发度最低。行级锁:开销大,加锁慢;会显现死锁;锁定粒度最小,出现锁冲突的概率最低,并发度亦最高。页面锁:开销和加锁时间界于表锁和行锁之间;会显现死锁;锁定粒度界于表锁和行锁之间,并发度通常。
2.Mysql中有那些区别的表类型?
BDB、HEAP、ISAM、MERGE、MyISAM、InnoDB以及Gemeni,总共7种Mysql表类型
3.简述在MySQL数据库中MyISAM和InnoDB的区别
MyISAM:
不支持事务,然则每次查找都是原子的;
支持表级锁,即每次操作是对全部表加锁;
存储表的总行数;
一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;
采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,然则辅索引不消保准独一性。
InnoDb:
支持ACID的事务,支持事务的四种隔离级别;
支持行级锁及外键约束:因此呢能够支持写并发;
不存储总行数;
一个InnoDb引擎存储在一个文件空间(共享表空间,表体积不受操作系统掌控,一个表可能分布在多个文件里) 亦有可能为多个(设置为独立表空,表体积受操作系统文件体积限制,通常为2
G),受操作系统文件体积的限制;
主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;
因此呢从辅索引查询数据,必须先经过辅索引找到主键值,再拜访辅索引;
最好运用自增主键,防止插进数据时,为维持B+树结构,文件的大调节。
4.Mysql中InnoDB支持的四种事务隔离级别名叫作,以及逐级之间的区别?
SQL标准定义的四个隔离级别为: read uncommited :读到未提交数据read committed:脏读,不可重复读repeatable read:可重读serializable :串行事物
5.CHAR和VARCHAR的区别?CHAR和VARCHAR类型在存储和检索方面有所区别CHAR列长度固定为创建表时声明的长度,长度值范围是1到255当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。
6.主键和候选键有什么区别?
表格的每一行都由主键独一标识,一个表仅有一个主键。
主键亦是候选键。根据惯例,候选键能够被指定为主键,并且能够用于任何外键引用。
7.myisamchk是用来做什么的?
它用来压缩MyISAM表,这减少了磁盘或内存运用。
8.MyISAM Static和MyISAM Dynamic有什么区别?
在MyISAM Static上的所有字段有固定宽度。动态MyISAM表将拥有像TEXT,BLOB等字段,以适应区别长度的数据类型。
MyISAM Static在受损状况下更易恢复。
9.倘若一个表有一列定义为TIMESTAMP,将出现什么?
每当行被更改时,时间戳字段将获取当前时间戳。
10.列设置为AUTO INCREMENT时,倘若在表中达到最大值,会出现什么状况?
它会停止递增,任何进一步的插进都将产生错误,由于密钥已被运用。
11.怎么样才可找出最后一次插进时分配了哪个自动增量?
LAST_INSERT_ID将返回由Auto_increment分配的最后一个值,并且不必须指定表名叫作。
12.怎样看到为表格定义的所有索引?
索引是经过以下方式为表格定义的:
SHOW INDEX FROM ;
13.LIKE声明中的%和_是什么意思?
%对应于0个或更加多字符,_只是LIKE语句中的一个字符。
14.怎样在Unix和Mysql时间戳之间进行转换?
UNIX_TIMESTAMP是从Mysql时间戳转换为Unix时间戳的命令 FROM_UNIXTIME是从Unix时间戳转换为Mysql时间戳的命令
15.列对比运算符是什么?
在SELECT语句的列比较中运用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR或LIKE运算符。
16.BLOB和TEXT有什么区别?
BLOB是一个二进制对象,能够容纳可变数量的数据。TEXT是一个不区分体积写的BLOB。
BLOB和TEXT类型之间的独一区别在于对BLOB值进行排序和比较时区分体积写,对TEXT值不区分体积写。
17.mysql_fetch_array和mysql_fetch_object的区别是什么?
mysql_fetch_array() – 将结果行做为相关数组或来自数据库的常规数组返回。
mysql_fetch_object – 从数据库返回结果行做为对象。
18.MyISAM表类型将在哪里存储,并且还供给其存储格式?
每一个MyISAM表格以三种格式存储在磁盘上:
“.frm”文件 存储表定义
数据文件拥有“.MYD”(MYData)扩展名
索引文件拥有“.MYI”(MYIndex)扩展名
19.Mysql怎样优化DISTINCT?
DISTINCT在所有列上转换为GROUP BY,并与ORDER BY子句结合运用。
SELECT DISTINCT t1.a FROM t1,t2 where t1.a=t2.a;
20.能够运用多少列创建索引?
任何标准表最多能够创建16个索引列。
21.NOW()和CURRENT_DATE()有什么区别?
NOW()命令用于表示当前年份,月份,日期,小时,分钟和秒。
CURRENT_DATE()仅表示当前年份,月份和日期。
22.什么是非标准字符串类型?
TINYTEXT
TEXT
MEDIUMTEXT
LONGTEXT
23.什么是通用SQL函数?
CONCAT(A, B) – 连接两个字符串值以创建单个字符串输出。一般用于将两个或多个字段合并为一个字段。
FORMAT(X, D)- 格式化数字X到D有效数字。
CURRDATE(), CURRTIME()- 返回当前日期或时间。
NOW() – 将当前日期和时间做为一个值返回。
MONTH(),DAY(),YEAR(),WEEK(),WEEKDAY() – 从日期值中提取给定数据。
HOUR(),MINUTE(),SECOND() – 从时间值中提取给定数据。
DATEDIFF(A,B) – 确定两个日期之间的差异,一般用于计算年龄
SUBTIMES(A,B) – 确定两次之间的差异。
FROMDAYS(INT) – 将整数天数转换为日期值。
24.MYSQL支持事务吗?
在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,因此在缺省状况下,mysql是不支持事务的。
然则倘若你的MYSQL表类型是运用InnoDB Tables 或 BDB tables的话,你的MYSQL就能够运用事务处理,运用SET AUTOCOMMIT=0就能够使MYSQL准许在非autocommit模式,在非autocommit模式下,你必要运用COMMIT来提交你的更改,或用ROLLBACK来回滚你的更改。
25.mysql里记录货币用什么字段类型好
NUMERIC和DECIMAL类型被Mysql实现为一样的类型,这在SQL92标准准许。她们被用于保留值,该值的准确精度是极其重要的值,例如与金钱相关的数据。当声明一个类是这些类型之一时,精度和规模的能被(并且一般是)指定。
例如:
salary DECIMAL(9,2)
在这个例子中,9(precision)表率将被用于存储值的总的小数位数,而2(scale)表率将被用于存储小数点后的位数。
因此呢,在这种状况下,能被存储在salary列中的值的范围是从-9999999.99到9999999.99。
26.mysql相关权限的表都有哪几个?
Mysql服务器经过权限表来掌控用户对数据库的拜访,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。
27.列的字符串类型能够是什么?
SET
BLOB
ENUM
CHAR
TEXT
28.MySQL数据库运维
MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化? 设计良好的数据库结构,准许部分数据冗余,尽可能避免join查找,提有效率。选取合适的表字段数据类型和存储引擎,适当的添加索引。mysql库主从读写分离。找规律分表,减少单表中的数据量加强查找速度。添加缓存机制,例如memcached,redis等。不经常改动的页面,生成静态页面。书写有效率的SQL。例如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE
29.锁的优化策略读写分离分段加锁减少锁持有的时间多个线程尽可能以相同的次序去获取资源
不可将锁的粒度过于细化,否则可能会显现线程的加锁和释放次数太多,反而效率不如一次加一把大锁。
30.索引的底层实现原理和优化
B+树,经过优化的B+树
重点是在所有的叶子结点中增多了指向下一个叶子节点的指针,因此呢InnoDB建议为大部分表运用默认自增的主键做为主索引。
31.什么状况下设置了索引但没法运用以“%”开头的LIKE语句,模糊匹配OR语句前后无同期运用索引数据类型显现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
32实践中怎样优化MySQLSQL语句及索引的优化数据库表结构的优化系统配置的优化硬件的优化
仔细能够查看 阿里P8架构师谈:MySQL慢查找优化、索引优化、以及表等优化总结
33.优化数据库的办法选择最适用的字段属性,尽可能减少定义字段宽度,尽可能把字段设置NOTNULL,例如’省份’、’性别’最好适用ENUM运用连接(JOIN)来代替子查找适用联合(UNION)来代替手动创建的临时表事务处理锁定表、优化事务处理适用外键,优化锁定表创立索引优化查找语句
34.简单描述mysql中,索引,主键,独一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个构成部分),它们包括着对数据表里所有记录的引用指针。
普通索引(由关键字KEY或INDEX定义的索引)的独一任务是加快对数据的拜访速度。
普通索引准许被索引的数据列包括重复的值。倘若能确定某个数据列将只包括彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个独一索引。亦便是说,独一索引能够保准数据记录的独一性。
主键,是一种特殊的独一索引,在一张表中只能定义一个主键索引,主键用于独一标识一条记录,运用关键字 PRIMARY KEY 来创建。
索引能够覆盖多个数据列,如像INDEX(columnA, columnB)索引,这便是联合索引。
索引能够极重的加强数据的查找速度,然则会降低插进、删除、更新表的速度,由于在执行这些写操作时,还要操作索引文件。
35.数据库中的事务是什么?
事务(transaction)是做为一个单元的一组有序的数据库操作。倘若组中的所有操作都成功,则认为事务成功,即使仅有一个操作失败,事务亦不成功。倘若所有操作完成,事务则提交,其修改将功效于所有其他数据库进程。倘若一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
事务特性:
(1)原子性:即不可分割性,事务要么所有被执行,要么就所有不被执行。
(2)一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
(3)隔离性。在事务正确提交之前,不准许把该事务对数据的任何改变供给给任何其他事务,
(4) 持久性。事务正确提交后,其结果将永久保留在数据库中,即使在事务提交后有了其他故障,事务的处理结果亦会得到保留。
通俗理解事务:
事务便是被绑定在一块做为一个规律工作单元的SQL语句分组,倘若任何一个语句操作失败那样全部操作就被失败,以后操作就会回滚到操作前状态,或是上有个节点。
为了保证要么执行,要么不执行,就能够运用事务。要将有组语句做为事务思虑,就必须经过ACID测试,即原子性,一致性,隔离性和持久性。
36.SQL注入漏洞产生的原由?怎样防止?
SQL注入产生的原由:程序研发过程中不重视规范书写sql语句和对特殊字符进行过滤,引起客户端能够经过全局变量POST和GET提交有些sql语句正常执行。
防止SQL注入的方式: 开启配置文件中的magic_quotes_gpc 和 magic_quotes_runtime设置执行sql语句时运用addslashes进行sql语句转换Sql语句书写尽可能不要省略双引号和单引号。过滤掉sql语句中的有些关键词:update、insert、delete、select、 * 。加强数据库表和字段的命名技巧,对有些重要的字段按照程序的特点命名,取很难被猜到的。
37.为表中得字段选取合适得数据类型
字段类型优先级: 整形>date,time>enum,char>varchar>blob,text 优先思虑数字类型,其次是日期或二进制类型,最后是字符串类型,同级别得数据类型,应该优先选取占用空间小的数据类型
38.存储时期Datatime:以 YYYY-MM-DD HH:MM:SS 格式存储时期时间,精确到秒,占用8个字节得存储空间;datatime类型与时区无关 Timestamp:以时间戳格式存储,占用4个字节,范围小1970-1-1到2038-1-19,表示依赖于所指定得时区,默认在第1个列行的数据修改时能够自动得修改timestamp列的值Date:(生日)占用得字节数比运用字符串.datatime.int储存要少,运用date只必须3个字节,存储日期月份,还能够利用日期时间函数进行日时期得计算Time:存储时间部分得数据 重视:不要运用字符串类型来存储日期时间数据(一般比字符串占用得储存空间小,在进行查询过滤能够利用日期得函数) 运用int存储日期时间不如运用timestamp类型
39.索引关联(关系型数据库MySQL):
索引的目的是什么?
快速拜访数据表中的特定信息,加强检索速度
创建独一性索引,保准数据库表中每一行数据的独一性。加速表和表之间的连接
运用分组和排序子句进行数据检索时,能够明显减少查找中分组和排序的时间
索引对数据库系统的消极影响是什么?
消极影响:创建索引和守护索引必须耗费时间,这个时间随着数据量的增多而增多;索引必须占用理学空间,不但是表必须占用数据空间,每一个索引亦必须占用理学空间;当对表进行增、删、改、的时候索引亦要动态守护,这般就降低了数据的守护速度。
为数据表创立索引的原则有那些?
在最频繁运用的、用以缩小查找范围的字段上创立索引。在频繁运用的、必须排序的字段上创立索引
什么状况下不宜创立索引?
针对查找中很少触及的列或重复值比较多的列,不宜创立索引。针对有些特殊的数据类型,不宜创立索引,例如文本字段(text)等
40.解释MySQL外连接、内连接与自连接的区别
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它指的是不运用任何要求,直接将一个表的所有记录和另一个表中的所有记录一一匹配。
内连接 则是仅有要求的交叉连接,按照某个要求筛选出符合要求的记录,不符合要求的记录不会出此刻结果集中,即内连接只连接匹配的行。
外连接 其结果集中不仅包括符合连接要求的行,况且还会包含左表、右表或两个表中的所有数据行,这三种状况依次叫作之为左外连接,右外连接,和全外连接。
左外连接 亦叫作左连接,左表为主表,左表中的所有记录都会出此刻结果集中,针对哪些在右表中并无匹配的记录,仍然要表示,右边对应的哪些字段值以NULL来填充。
右外连接 亦叫作右连接,右表为主表,右表中的所有记录都会出此刻结果集中。左连接和右连接能够互换,MySQL日前还不支持全外连接。
41.Myql中的事务回滚机制概述
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚指的是将该事务已然完成的对数据库的更新操作撤销。
要同期修改数据库中两个区别表时,倘若它们不是一个事务的话,当第1个表修改完,可能第二个表修改过程中显现了反常而没能修改,此时就仅有第二个表依旧是未修改之前的状态,而第1个表已然被修改完毕。而当你把它们设定为一个事务的时候,当第1个表修改完,第二表修改显现反常而没能修改,第1个表和第二个表都要回到未修改的状态,这便是所说的事务回滚
42.SQL语言包含哪几部分?每部分都有那些操作关键字?
SQL语言包含数据定义(DDL)、数据操作(DML),数据掌控(DCL)和数据查找(DQL)四个部分。
数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等
数据操作:Select ,insert,update,delete,
数据掌控:grant,revoke
数据查找:select
43.完整性约束包含那些?
数据完整性(Data Integrity)指的是数据的精确(Accuracy)和靠谱性(Reliability)。
分为以下四类: 实体完整性:规定表的每一行在表中是惟一的实体。域完整性:指的是表中的列必要满足某种特定的数据类型约束,其中约束又包含取值范围、精度等规定。参照完整性:指的是两个表的主关键字和外关键字的数据应一致,保准了表之间的数据的一致性,防止了数据丢失或无道理的数据在数据库中扩散。用户定义的完整性:区别的关系数据库系统按照其应用环境的区别,常常还必须有些特殊的约束要求。用户定义的完整性即是针对某个特定关系数据库的约束要求,它反映某一详细应用必要满足的语义需求。
与表相关的约束:包含列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。
44.MySQL的锁?
数据库是一个多用户运用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同期存取同一数据的状况。若对并发操作不加掌控就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发掌控的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了必定的掌控,在该事务释放锁之前,其他的事务不可对此数据对象进行更新操作。
基本锁类型:锁包含行级锁和表级锁
45.什么叫视图?游标是什么?
视图是一种虚拟的表,拥有和理学表相同的功能。能够对视图进行增,改,查,操作,视图一般是有一个表或多个表的行或列的子集。对视图的修改不影响基本表。它使得咱们获取数据更易,相比多表查找。
游标:是对查找出来的结果集做为一个单元来有效的处理。游标能够定在该单元中的特定行,从结果集的当前行检索一行或多行。能够对结果集当前行做修改。通常不运用游标,然则必须逐条处理数据的时候,游标显出非常重要。
46.什么是存储过程?用什么来调用?
存储过程是一个预编译的SQL语句,优点是准许模块化的设计,便是说只需创建一次,以后在该程序中就能够调用多次。倘若某次操作必须执行多次SQL,运用存储过程比单纯SQL语句执行要快。
能够用一个命令对象来调用存储过程。
47.怎样通俗地理解三个范式?
概念
第1范式:1NF是对属性的原子性约束,需求属性拥有原子性,不可再分解;
第二范式:2NF是对记录的惟一性约束,需求记录有惟一标识,即实体的惟一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不可由其他字段派生出来,它需求字段无冗余。。
范式化设计优缺点
优点:能够尽可能得减少许据冗余,使得更新快,体积小
缺点:针对查找必须多个表进行相关,减少写得效率增多读得效率,更难进行索引优化
反范式化的优缺点
优点:能够减少表得相关,能够更好得进行索引优化
缺点:数据冗余以及数据反常,数据得修改必须更加多的成本
48.什么是基本表?什么是视图?基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表
49.MySQL视图的优点视图能够简化用户的操作视图运用户能以多种方向看待同一数据视图为数据库供给了必定程度的规律独立性视图能够对机密数据供给安全守护。
50. NULL是什么意思
NULL这个值暗示UNKNOWN(未知):它不暗示“”(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。
能够运用IS NULL来进行NULL判断
51.主键、外键和索引的区别?
1、从定义上却分 主键:独一标识一条记录,不可有重复的,不准许为空外键:表的外键是另一表的主键, 外键能够有重复的, 能够是空值索引:该字段无重复值,但能够有一个空值
2、从功效上区分 主键:用来保准数据完整性外键:用来和其他表创立联系用的索引:是加强查找排序的速度
3、从个数上区分 主键:主键只能有一个外键:一个表能够有多个外键索引:一个表能够有多个独一索引
52.SQL语句优化办法Where子句中:where表之间的连接必要写在其他Where要求之前,哪些能够过滤掉最大数量记录的要求必要写在Where子句的末尾.HAVING最后。用EXISTS替代IN、用NOT EXISTS替代NOT IN。避免在索引列上运用计算避免在索引列上运用IS NULL和IS NOT NULL对查找进行优化,应尽可能避免全表扫描,首要应思虑在 where 及 order by 触及的列上创立索引。应尽可能避免在 where 子句中对字段进行 null 值判断,否则将引起引擎放弃运用索引而进行全表扫描应尽可能避免在 where 子句中对字段进行表达式操作,这将引起引擎放弃运用索引而进行全表扫描
链接:https://github.com/caokegege/Interview
|