Mysql面试题

Mysql面试题

【持续更新】node

第一部分

一、mysql如何作分页mysql

mysql数据库作分页用limit关键字,它后面跟两个参数startIndex和pageSize面试


二、mysql引擎有哪些,各自的特色是什么?redis

innodb和myisam两个引擎,二者区别是
innodb支持事物,myisam不支持
innodb支持外键,myisam不支持
innodb不支持全文索引,myisam支持全文索引
innodb提供提交、回滚、崩溃恢复能力的事物的安全能力,实现并发控制
myisam提供较高的插入和查询记录的效率,主要用于插入和查询算法


三、数据库怎么创建索引sql

create index account_index on `table name `(`字段名`(length)数据库


四、一张表多个字段,怎么建立组合索引django

create index account_index on `table name `(`字段名`,'字段名')编程


五、如何应对数据的高并发,大量的数据计算windows

1.建立索引
2.数据库读写分离,两个数据库,一个做为写,一个做为读
3. 外键去掉
4.django中orm表性能相关的
select_related:一对多使用,查询主动作连表
prefetch_related:多对多或者一对多的时候使用,不作连表,作屡次查询

 

六、数据库内连表、左连表、右连表

内链接是根据某个条件链接两个表共有的数据
左链接是根据某个条件以及左边的表链接数据,右边的表没有数据的话则为null
右链接是根据某个条件以及右边的表链接数据,左边的表没有数据的话则为null

 

七、视图和表的区别

视图是已经编译好的sql语句,是基于sql语句的结果集的可视化的表,而表不是
视图是窗口,表示内容
视图没有实际的物理记录,而表有
视图的创建和删除只影响视图自己,不影响对应的表

 

八、关系型数据库的特色

数据集中控制
数据独立性高
数据共享性好
数据冗余度小
数据结构化
统一的数据保护能力

 

九、mysql数据库都有哪些索引

普通索引:普通索引仅有一个功能:加速查找
惟一索引:惟一索引两个功能:加速查找和惟一约束(可含null)
外键索引:外键索引两个功能:加速查找和惟一约束(不可为null)
联合索引:联合索引是将n个列组合成一个索引,应用场景:同时使用n列来进行查询

 

十、存储过程

存储过程不容许执行return语句,可是能够经过out参数返回多个值,存储过程通常是做为一个独立的部分来执行,存储过程是一个预编译的SQL语句。



十一、sql优化

select句中避免使用 '*'
减小访问数据库的次数
删除重复记录
用where子句替代having子句
减小对表的查询
explain等

 

十二、char和vachar区别

char是固定长度,存储须要空间12个字节,处理速度比vachar快,费内存空间
vachar是不固定长度,须要存储空间13个字节,节约存储空间

 

1三、Mechached与redis

mechached:只支持字符串,不能持久化,数据仅存在内存中,宕机或重启数据将所有失效
不能进行分布式扩展,文件没法异步法。
优势:mechached进程运行以后,会预申请一块较大的内存空间,本身进行管理。
redis:支持服务器端的数据类型,redis与memcached相比来讲,拥有更多的数据结构和并发支持更丰富的数据操做,可持久化。
五大类型数据:string、hash、list、set和有序集合,redis是单进程单线程的。
缺点:数据库的容量受到物理内存的限制。

 

1四、sql注入

sql注入是比较常见的攻击方式之一,针对编程员编程的疏忽,经过sql语句,实现帐号没法登录,甚至篡改数据库。
防止:凡涉及到执行sql中有变量时,切记不要用拼接字符串的方法

 

1五、什么是触发器

触发器是一种特殊的存储过程,主要是经过事件来触发而被执行的,他能够强化约束,来维护数据库的完整性和一致性,能够跟踪数据内的操做从而不容许未经许可的 更新和变化,能够联级运算。
只有表支持触发器,视图不支持触发器

1六、游标是什么?

是对查询出来的结果集做为一个单元来有效的处理,游标能够定在该单元中的特定行,从结果集的当前行检索一行或多行,能够对结果集当前行作修改,
通常不使用游标,可是须要逐条处理数据的时候,游标显得十分重要

 

1七、 数据库支持多有标准的SQL数据类型,重要分为三类

数值类型(tinyint,int,bigint,浮点数,bit)
字符串类型(char和vachar,enum,text,set)
日期类型(date,datetime,timestamp)

 

1八、mysql慢查询

慢查询对于跟踪有问题的查询颇有用,能够分析出当前程序里哪些sql语句比较耗费资源
慢查询定义:
指mysql记录全部执行超过long_query_time参数设定的时间值的sql语句,慢查询日志就是记录这些sql的日志。
mysql在windows系统中的配置文件通常是my.ini找到mysqld
log-slow-queries = F:\MySQL\log\mysqlslowquery.log 为慢查询日志存放的位置,通常要有可写权限
long_query_time = 2 2表示查询超过两秒才记录

1九、memcached命中率

命中:能够直接经过缓存获取到须要的数据
不命中:没法直接经过缓存获取到想要的数据,须要再次查询数据库或者执行其余的操做,缘由多是因为缓存中根本不存在,或者缓存已通过期
缓存的命中率越高则表示使用缓存的收益越高,应额用的性能越好,抗病发能力越强
运行state命令能够查看memcached服务的状态信息,其中cmd—get表示总的get次数,get—hits表示命中次数,命中率=get—hits / cmd—get

20、Oracle和MySQL该如何选择,为何?

他们都有各自的优势和缺点。考虑到时间因素,我倾向于MySQL
选择MySQL而不选Oracle的缘由
MySQL开源
MySQL轻便快捷
MySQL对命令行和图形界面的支持都很好

MySQL支持经过Query Browser进行管理

 

2一、什么状况下适合创建索引?

1.为常常出如今关键字order by、group by、distinct后面的字段,创建索引
2.在union等集合操做的结果集字段上,创建索引,其创建索引的目的同上
3.为常常用做查询选择的字段,创建索引
4.在常常用做表链接的属性上,创建索引

2二、数据库底层是用什么结构实现的,你大体画一下

底层用B+数实现,结构图参考:
http://blog.csdn.net/cjfeii/article/details/10858721
http://blog.csdn.net/tonyxf121/article/details/8393545

 

2三、sql语句应该考虑哪些安全性?

1.防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语句绑定变量
2.最小权限原则,特别是不要用root帐户,为不一样的类型的动做或者组建使用不一样的帐户
3.当sql运行出错时,不要把数据库返回的错误信息所有显示给用户,以防止泄漏服务器和数据库相关信息

 

2四、数据库事物有哪几种?

隔离性、持续性、一致性、原子性

 

2五、MySQ数据表在什么状况下容易损坏?

服务器忽然断电致使数据文件损坏
强制关机,没有先关闭mysq服务器等

 

2六、drop,delete与truncate的区别

drop直接删除表
truncate删除表中数据,再插入时自增加id又从1开始
delete删除表中数据,能够加where子句

 

2七、数据库范式

1.第一范式:就是无重复的列
2.第二范式:就是非主属性非部分依赖于主关键字
3.第三范式:就是属性不依赖于其余非主属性(消除冗余)

 

2八、MySQL锁类型

根据锁的类型分:能够分为共享锁、排他锁、意向共享锁和意向排他锁
根据锁的粒度分:能够分为行锁、表锁
对于mysql而言,事务机制更可能是靠底层的存储引擎来实现的,所以,mysql层面只有表锁,
而支持事物的innodb存储引发则实现了行锁(在行相应的索引记录上的锁)
说明:对于更新操做(读不上锁),只有走索引才可能上行锁
MVCC(多版本并发控制)并发控制机制下,任何操做都不会阻塞读取操做,
读取操做也不会阻塞任何操做,只由于读不上锁
共享锁:由读表操做加上的锁,加锁后其余用户只能获取该表或行的共享锁,不能获取排他锁,
也就是说只能读不能写
排他锁:由写表操做加上的锁,加锁后其余用户不能获取该表或该行的任何锁,典型mysql事物中的更新操做
意向共享锁(IS):事物打算给数据行加行共享锁,事物在给一个数据行加共享锁前必须先取得该表的IS锁
意向排他锁(IX):事物打算给数据行加行排他锁,事物在给一个数据行家排他锁前必须先取得该表的IX锁

 

2九、如何解决MYSQL数据库中文乱码问题?

1.在数据库安装的时候指定字符集
2.若是在按完了之后能够更改配置文件
3.创建数据库时候:指定字符集类型
4.建表的时候也指定字符集

 

 

30、数据库应用系统设计

1.规划
2.需求分析
3.概念模型设计
4.逻辑设计
5.物理设计
6. 程序编制及调试
7.运行及维护

 

第二部分

1、为何用自增列做为主键

一、若是咱们定义了主键(PRIMARY KEY),那么InnoDB会选择主键做为汇集索引、若是没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的惟一索引做为主键索引、若是也没有这样的惟一索引,则InnoDB会选择内置6字节长的ROWID做为隐含的汇集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。

二、数据记录自己被存于主索引(一颗B+Tree)的叶子节点上。这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,所以每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,若是页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)

三、若是表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页

四、若是使用非自增主键(若是身份证号或学号等),因为每次插入主键的值近似于随机,所以每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增长了不少开销,同时频繁的移动、分页操做形成了大量的碎片,获得了不够紧凑的索引结构,后续不得不经过OPTIMIZE TABLE来重建表并优化填充页面。

 

2、为何使用数据索引能提升效率

一、数据索引的存储是有序的

二、在有序的状况下,经过索引查询一个数据是无需遍历索引记录的

三、极端状况下,数据索引的查询效率为二分法查询效率,趋近于 log2(N)

 

3、B+树索引和哈希索引的区别

B+树是一个平衡的多叉树,从根节点到每一个叶子节点的高度差值不超过1,并且同层级的节点间有指针相互连接,是有序的

哈希索引就是采用必定的哈希算法,把键值换算成新的哈希值,检索时不须要相似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法便可,是无序的

 

 

4、哈希索引的优点:

一、等值查询。哈希索引具备绝对优点(前提是:没有大量重复键值,若是大量重复键值时,哈希索引的效率很低,由于存在所谓的哈希碰撞问题。)

 

5、哈希索引不适用的场景:

一、不支持范围查询

二、不支持索引完成排序

三、不支持联合索引的最左前缀匹配规则

一般,B+树索引结构适用于绝大多数场景,像下面这种场景用哈希索引才更有优点:

在HEAP表中,若是存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引,例如这种SQL:

select id,name from table where name='李明'; — 仅等值查询

而经常使用的InnoDB引擎中默认使用的是B+树索引,它会实时监控表上索引的使用状况,若是认为创建哈希索引能够提升查询效率,则自动在内存中的“自适应哈希索引缓冲区”创建哈希索引(在InnoDB中默认开启自适应哈希索引),经过观察搜索模式,MySQL会利用index key的前缀创建哈希索引,若是一个表几乎大部分都在缓冲池中,那么创建一个哈希索引可以加快等值查询。

注意:在某些工做负载下,经过哈希索引查找带来的性能提高远大于额外的监控索引搜索状况和保持这个哈希表结构所带来的开销。但某些时候,在负载高的状况下,自适应哈希索引中添加的read/write锁也会带来竞争,好比高并发的join操做。like操做和%的通配符操做也不适用于自适应哈希索引,可能要关闭自适应哈希索引。

 

6、B树和B+树的区别

一、B树,每一个节点都存储key和data,全部节点组成这棵树,而且叶子节点指针为nul,叶子结点不包含任何关键字信息。

二、B+树,全部的叶子结点中包含了所有关键字的信息,及指向含有这些关键字记录的指针,且叶子结点自己依关键字的大小自小而大的顺序连接,全部的非终端结点能够当作是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含须要查找的有效信息)

 

 

7、为何说B+比B树更适合实际应用中操做系统的文件索引和数据库索引?

一、B+的磁盘读写代价更低B+的内部结点并无指向关键字具体信息的指针。所以其内部结点相对B树更小。若是把全部同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的须要查找的关键字也就越多。相对来讲IO读写次数也就下降了。

二、B+-tree的查询效率更加稳定因为非终结点并非最终指向文件内容的结点,而只是叶子结点中关键字的索引。因此任何关键字的查找必须走一条从根结点到叶子结点的路。全部关键字查询的路径长度相同,致使每个数据的查询效率至关。

8、MySQL联合索引

一、联合索引是两个或更多个列上的索引。对于联合索引:Mysql从左到右的使用索引中的字段,一个查询能够只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 能够支持a 、 a,b 、 a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

二、利用索引中的附加列,您能够缩小搜索的范围,但使用一个具备两列的索引 不一样于使用两个单独的索引。复合索引的结构与电话簿相似,人名由姓和名构成,电话簿首先按姓氏对进行排序,而后按名字对有相同姓氏的人进行排序。若是您知 道姓,电话簿将很是有用;若是您知道姓和名,电话簿则更为有用,但若是您只知道名不姓,电话簿将没有用处。

9、什么状况下应不建或少建索引

一、表记录太少

二、常常插入、删除、修改的表

三、数据重复且分布平均的表字段,假如一个表有10万行记录,有一个字段A只有T和F两种值,且每一个值的分布几率大约为50%,那么对这种表A字段建索引通常不会提升数据库的查询速度。

四、常常和主字段一块查询但主字段索引值比较多的表字段

10、什么是表分区?

表分区,是指根据必定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,可是底层倒是由多个物理分区组成。

11、表分区与分表的区别

分表:指的是经过必定规则,将一张表分解成多张不一样的表。好比将用户订单记录根据时间成多个表。

分表与分区的区别在于:分区从逻辑上来说只有一张表,而分表则是将一张表分解成多张表。

12、表分区有什么好处?

一、分区表的数据能够分布在不一样的物理设备上,从而高效地利用多个硬件设备。 2. 和单个磁盘或者文件系统相比,能够存储更多数据

二、优化查询。在where语句中包含分区条件时,能够只扫描一个或多个分区表来提升查询效率;涉及sum和count语句时,也能够在多个分区上并行处理,最后汇总结果。

三、分区表更容易维护。例如:想批量删除大量数据能够清除整个分区。

四、可使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问,ext3问价你系统的inode锁竞争等。

十3、分区表的限制因素

一、一个表最多只能有1024个分区

二、MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了非整数表达式分区的支持。

三、若是分区字段中有主键或者惟一索引的列,那么多有主键列和惟一索引列都必须包含进来。即:分区字段要么不包含主键或者索引列,要么包含所有主键和索引列。

四、分区表中没法使用外键约束

五、MySQL的分区适用于一个表的全部数据和索引,不能只对表数据分区而不对索引分区,也不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。

十4、如何判断当前MySQL是否支持分区?

命令:show variables like '%partition%' 运行结果:

mysql> show variables like '%partition%';
+-------------------+-------+| Variable_name | Value |+-------------------+-------+| have_partitioning | YES |+-------------------+-------+1 row in set (0.00 sec)

have_partintioning 的值为YES,表示支持分区。

十5、MySQL支持的分区类型有哪些?

一、RANGE分区: 这种模式容许将数据划分不一样范围。例如能够将一个表经过年份划分红若干个分区

二、LIST分区: 这种模式容许系统经过预约义的列表的值来对数据进行分割。按照List中的值分区,与RANGE的区别是,range分区的区间范围值是连续的。

三、HASH分区 :这中模式容许经过对表的一个或多个列的Hash Key进行计算,最后经过这个Hash码不一样数值对应的数据区域进行分区。例如能够创建一个对表主键进行分区的表。

四、KEY分区 :上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。

十6、四种隔离级别

一、Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

二、Repeatable read (可重复读):可避免脏读、不可重复读的发生。

三、Read committed (读已提交):可避免脏读的发生。

四、Read uncommitted (读未提交):最低级别,任何状况都没法保证。

十7、关于MVVC

MySQL InnoDB存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)。MVCC最大的好处:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是很是重要的,极大的增长了系统的并发性能,现阶段几乎全部的RDBMS,都支持了MVCC。

一、LBCC:Lock-Based Concurrency Control,基于锁的并发控制。

二、MVCC:Multi-Version Concurrency Control,基于多版本的并发控制协议。纯粹基于锁的并发机制并发量低,MVCC是在基于锁的并发控制上的改进,主要是在读操做上提升了并发量。

 

十8、在MVCC并发控制中,读操做能够分红两类:

一、快照读 (snapshot read):读取的是记录的可见版本 (有多是历史版本),不用加锁(共享读锁s锁也不加,因此不会阻塞其余事务的写)。

二、当前读 (current read):读取的是记录的最新版本,而且,当前读返回的记录,都会加上锁,保证其余事务不会再并发修改这条记录。

 

十9、行级锁定的优势:

一、当在许多线程中访问不一样的行时只存在少许锁定冲突。

二、回滚时只有少许的更改

三、能够长时间锁定单一的行。

 

二10、行级锁定的缺点:

一、比页级或表级锁定占用更多的内存。

二、当在表的大部分中使用时,比页级或表级锁定速度慢,由于你必须获取更多的锁。

三、若是你在大部分数据上常常进行GROUP BY操做或者必须常常扫描整个表,比其它锁定明显慢不少。

四、用高级别锁定,经过支持不一样的类型锁定,你也能够很容易地调节应用程序,由于其锁成本小于行级锁定。

 

二11、MySQL优化

一、开启查询缓存,优化查询

二、explain你的select查询,这能够帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的

三、当只要一行数据时使用limit 1,MySQL数据库引擎会在找到一条数据后中止搜索,而不是继续日后查少下一条符合记录的数据

四、为搜索字段建索引

五、使用 ENUM 而不是 VARCHAR,若是你有一个字段,好比“性别”,“国家”,“民族”,“状态”或“部门”,你知道这些字段的取值是有限并且固定的,那么,你应该使用 ENUM 而不是VARCHAR。

六、Prepared StatementsPrepared Statements很像存储过程,是一种运行在后台的SQL语句集合,咱们能够从使用 prepared statements 得到不少好处,不管是性能问题仍是安全问题。Prepared Statements 能够检查一些你绑定好的变量,这样能够保护你的程序不会受到“SQL注入式”攻击

七、垂直分表

八、选择正确的存储引擎

 

二12、key和index的区别

一、key 是数据库的物理结构,它包含两层意义和做用,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)。包括primary key, unique key, foreign key 等

二、index是数据库的物理结构,它只是辅助查询的,它建立时会在另外的表空间(mysql中的innodb表空间)以一个相似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等;

 

二十3、Mysql 中 MyISAM 和 InnoDB 的区别有哪些?

区别:

一、InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,因此最好把多条SQL语言放在begin和commit之间,组成一个事务;

二、InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

三、InnoDB是汇集索引,数据文件是和索引绑在一块儿的,必需要有主键,经过主键索引效率很高。可是辅助索引须要两次查询,先查询到主键,而后再经过主键查询到数据。所以,主键不该该过大,由于主键太大,其余索引也都会很大。而MyISAM是非汇集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

四、InnoDB不保存表的具体行数,执行select count(*) from table时须要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只须要读出该变量便可,速度很快;

五、Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;

如何选择:

一、是否要支持事务,若是要请选择innodb,若是不须要能够考虑MyISAM;

二、若是表中绝大多数都只是读查询,能够考虑MyISAM,若是既有读写也挺频繁,请使用InnoDB。

三、系统奔溃后,MyISAM恢复起来更困难,可否接受;

四、MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(以前是MyISAM),说明其优点是有目共睹的,若是你不知道用什么,那就用InnoDB,至少不会差。

 

二十4、数据库表建立注意事项

一、字段名及字段配制合理性

  • 剔除关系不密切的字段;

  • 字段命名要有规则及相对应的含义(不要一部分英文,一部分拼音,还有相似a.b.c这样不明含义的字段);

  • 字段命名尽可能不要使用缩写(大多数缩写都不能明确字段含义);

  • 字段不要大小写混用(想要具备可读性,多个英文单词可以使用下划线形式链接);

  • 字段名不要使用保留字或者关键字;

  • 保持字段名和类型的一致性;

  • 慎重选择数字类型;

  • 给文本字段留足余量;

二、系统特殊字段处理及建成后建议

  • 添加删除标记(例如操做人、删除时间);

  • 创建版本机制;

三、表结构合理性配置

  • 多型字段的处理,就是表中是否存在字段可以分解成更小独立的几部分(例如:人能够分为男人和女人);

  • 多值字段的处理,能够将表分为三张表,这样使得检索和排序更加有调理,且保证数据的完整性!

四、其它建议

  • 对于大数据字段,独立表进行存储,以便影响性能(例如:简介字段);

  • 使用varchar类型代替char,由于varchar会动态分配长度,char指定长度是固定的;

  • 给表建立主键,对于没有主键的表,在查询和索引定义上有必定的影响;

  • 避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询上,效率立显;

  • 创建索引,最好创建在惟一和非空的字段上,创建太多的索引对后期插入、更新都存在必定的影响(考虑实际状况来建立);

相关文章
相关标签/搜索