Mysql常见面试题大全(一)

Mysql的root密码忘了怎么解决?

1.在linux系统中的/etc目录中有一个my.cnf文件,使用vim指令进入修改,在文件最后面加上  skip-grant-tables :表示跳过权限表,进而可以使用空密码登录

2.命令行中断窗口输入service mysqld restart         表示重启mysql服务,重新读取修改的my.cbf文件

3.进行修改密码,查询数据库中有一个mysql数据库,里面有一个user表

4.user表中有一个字段authentication_string(权限字段),记录mysql的原生密码

5.修改该字段进而修改密码:

       update user set authentication_string = password(“新密码”) where user = ‘root’;

6.刷新权限:flush privileges        命令行中断输入,因为已经登陆mysql了

7.exit退出mysql,将/etc/my.cnf文件中添加的命令删除或者注销,表示恢复成原来的状态,下次登录时还会走权限表


Mysql的存储引擎有哪些,可以说一说吗

       主要有INnoDB和Myisam,存储引擎是表级别的,每个表对应一个存储引擎


Mysql服务器防止表单重复提交的方法和原理

        给数据库增加唯一键约束(简单粗暴)

        在数据库建表的时候在ID字段添加主键约束,用户名、邮箱、电话等字段加唯一性约束。确保数据库只可以添加一条数据。

        利用Session防止表单重复提交(推荐)

        服务器返回表单页面时,会先生成一个subToken保存于session,并把该subToen传给表单页面。当表单提交时会带上subToken,服务器拦截器Interceptor会拦截该请求,拦截器判断session保存的subToken和表单提交subToken是否一致。若不一致或session的subToken为空或表单未携带subToken则不通过。

        首次提交表单时session的subToken与表单携带的subToken一致走正常流程,然后拦截器内会删除session保存的subToken。当再次提交表单时由于 session的subToken为空则不通过。从而实现了防止表单重复提交。


为什么建议INNoDB必须建主键?是否推荐自增主键

        因为INNoDB引擎会使用主键创建B+树索引,进而实现快速查找数据的目的,如果没有主键,InNoDB引擎会使用唯一索引作为B+树的节点,创建索引树,而不存在唯一索引时,会默认在表的最后一列添加一个列,由数据库保证该表的每一行数据唯一,这种情况会增加数据库负担,所以尽量创建主键索引。

        如果不是自增主键,添加新的索引元素时,可能导致表的索引结构发生变化,例如一个节点分裂成两个节点,导致上一级节点位置要添加一个额外的冗余索引,也就是表索引元素结构的变动,也会造成页分裂的情况;同时数据量较大时,会进行分库分表,各个数据库自增可能导致相同主键ID出现(可以使用不同自增步长解决);而自增索引会导致索引元素位置的浪费,实时维护时,如果旧的索引元素不再使用删除,未来也永远无法再次使用(BigInt主键的话可能性很小,因为范围非常大),索引要综合考虑


索引数据有哪些,说说他们的特点

        有hash结构和B+树两种结构

        hash结构采用数组+链表实现。对索引的key进行一次hash散列码计算出在数组中的存储位置,hash重复时就会放到链表中,将索引元素和数据对应的磁盘地址放进去,查看数据时再进行hash计算就可以定位出数据存储的位置。hash结构的优点是效率高,查找数据只需要经过一次运算就可以得到,时间复杂度只有O(1),但是实际应用中使用没有B+树使用次数多,问题如下:

        存在hash冲突问题,一个链表中存储了过多元素时,将会退化为链表,导致效率下降,但是mysql中底层也做了一些优化,减少了hash碰撞;个人认为最主要的原因还是hash结构不支持范围查找,仅能满足“=”和“IN”两种查找,例如where t > 2 无法进行hash定位,不使用范围查找就可以用

        而在B+树中可以实现范围查找,叶子节点之间存在双向指针,是一个双向链表结构,每个元素都是从左到右递增来存储的,例如t > 20,可以定位到t =20的位置,后面的都是满足条件的数据


使用B+树作为索引数据结构,而不是二叉树,或者二叉平衡树,红黑树?

        二叉树等其他的数据结构主要的问题是,导致多次的磁盘IO,造成数据读取速度较慢,哪怕是红黑树这种自平衡的二叉树,也可能导致树的高度较高,在动辄百万级数据的表时,难以达到优秀的查询效率。

        而B+树系列,在每一个节点上有多个数据索引从左到右一次排列,每个非叶子节点中的索引元素由两部分组成,一个是索引值,另一部分是下一级索引的位置指针。与B树的区别在于,非叶子节点上是没有数据的,存储的都是冗余索引,只有在叶子上才有数据,这样做的好处在于更快的数据查找。

        例如select的范围查找时,B树需要做局部的中序遍历,可能还要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能把所有数据取出来了。


B+树数据结构的索引,能放多少元素,查找一次数据多少次IO?

        B+树的节点在INNoDB引擎中,会把一个节点叫做一页数据,每个页page大小大约是16KB,(之所以设置为16KB,是为了和操作系统进行对应,因为操作系统读取数据时按照页来读取,不过操作系统的页大小是4KB,和这里的页不是同一种概念,如果要修改默认节点页的大小也可,不过最好设置为4的整数倍,原因同上)如果采用主键索引为int类型(4个字节)或者bigint类型(8个字节),这里视为8个字节,而指针部分默认开辟的是6个字节大小,所以一个索引元素占用14个字节,将一个节点放满可以达到1170个,而叶子节点上索引元素8个字节,假设加上data数据元素一共是1KB,那么高度为3的B+树,叶子节点为1170*1170*16,约为2千多万个索引。

        在INnoDB中对于每一页的数据,无论是叶子节点还是非叶子节点,会进行一个计算,因为每一页的数据部分可以确定最大占用内存数,所以可以计算出共多少个页目录,问道页目录数量时要会说,结构如下图,如果某一个数据行过大,例如大于16KB,会在数据部分结尾放置一个指针,剩下的数据另外找地方存,指向即可

        查找时只需要三次IO就能查找到,每次会从磁盘中拿取一页的数据放入缓冲区,之后在内存中遍历寻找(使用二分查找)下一层的索引或者是索引+数据,每层一次即可,如果已经将根节点和非叶子节点都放到内存(因为占用内存并不大),那么只需要一次IO就能查找到数据

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值