前言

当你简历上写了 熟悉mysql关系型数据库时,那肯定免不了面试官对于myql索引.事务,慢查询等等的考察

那么到底什么是索引,索引的数据类型有哪些,它们的优缺点以及如何去排查那些慢SQL语句等,虚都莫虚,下面都给各位安排安排

面试开始

面试官 : 我看你简历上写了熟悉mysql,那谈谈你是如何筛选出慢mysql语句呢?

是它,是它,就是它,慢查询日志,这个时候你肯定要把主动权掌握在自己手里了,只要面试官不说停,谁拉我都绝对不能停下来的

深吸一口气,开始你对面试官最深情的告白

首先可以先通过 show variables like ‘slow_query%’ 来确定慢查询是否开启,如果没有则通过 set global slow_query_log=‘ON’ 开启慢查询
其次我们可以设置慢查询日志的位置( set global slow_query_log_file )和设置超过多少秒( set global long_query_time )记录下慢sql,

这样就可以在指定的目录下查看日志,从而找出慢sql语句.

这个时候好像第一个问题已经回答完了,但是停是不可能停下来的,一辈子都不可能

慢sql的原因有很多,其中典型的就是表的数据量太大,查询的时候走了全表查询从而导致查询时间长,这个时候我们可以给一些数据量大的表添加索引,当然也可以通过 set global log_queries_not_using_indexes=1 记录下没有走索引的sql语句

面试官 : 心想 看来对慢查询挺熟悉的,既然自己说到了索引,那我就问问有关索引的问题 ?
那行,你刚才说到了索引, 那你谈谈索引的模型都有哪些 ?

哈希表它是一种以key-value形式存在的,只要输入key,就能找到对应的value,当然多个key也会存在hash值相同的情况,这个时候解决方案就拉出一个链表,它在查询等值的情况下效率高,但是在区间查询上就没有办法了 ,毕竟不是有序的

面试官:那有没有其他的数据结构可以解决呢 ?

有序数组在等值和范围查询上非常的优秀,但是在更新数据时就很痛苦了,当我们在中间插入时,必须移动后面所有的记录,这个成本就非常的大了,毕竟数据库也是很辛苦了,所以有序数组一般只使用于存储静态存储引擎,例如你xx年的花呗记录这样不会改变的历史数据

面试官 :那你说说mysql默认是哪种数据结构呢 ,为什么呢

mysql数据库索引默认采用的是B+树这种数据结构,(因为B+树牛逼 ,当然是开玩笑的) 因为像hash这种数据结构无法进行范围查询,有序数组在插入时效率低,而B+树它是有序的,可以进行范围查询,并且树的高度低,提高了查询索引时磁盘的IO次数,提高了效率

面试官 : 小伙子看来还是不错,那你谈谈索引都有哪些类型?

不同的存储引擎,索引的类型是不一样的,像myisam存储引擎,其索引结构的叶子节点存储的是指向数据的指针,这种索引就是非聚簇索引;而 InnoDB将 数据存储与索引放到了一块,找到索引也就找到了数据 ,这种叫做聚簇索引

面试官:还有其他的索引吗?

在InnoDB中, 在聚簇索引之外创建的索引称之为辅助索引 .
辅助索引存储的是主键的值及本索引的值,因此我们通过索引拿到主键值后,再通过主键索引找到对应行的值,这个过程称为回表,(绝对不能停),我们也可以通过覆盖索引优化回表操作,提高性能.
覆盖索引:因为辅助索引存储的是索引列的值以及主键值 ,那么可以直接把查询索引列的值作为查询,这样就可以避免回表.
例如 : select id from tb where name = ‘xx’ 给name建立索引 这时候故作卡顿, 嗯,嗯 ,还有一种常用的索引.

面试官 : 联合索引是吧?你谈一谈

因为每张表只能用到一个索引,但是我们查询的条件不止一个,我们就可以创建联合索引,在使用联合索引的时候一定得小心,不然很容易导致索引失效,遵循 最左匹配原则,也就是如果索引 (a,b,c) ,查询条件为 a=1 and b>2 and c=3,遇到范围性条件( >、<、between、like左匹配 ),后面的列就无法使用索引了

面试官 : 这小伙子基础掌握得还可以 ,有点墨水, 今天MYSQL部分就先到这里
加入313782132,群内可领取学习资料、面试技巧、内推机会。

面试结束

后续补充:
索引失效的情况
1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效

2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效

3、组合索引,不是使用第一列索引,索引失效。

4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。

5、在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。

6、在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0

7、对索引字段进行计算操作、字段上使用函数

8、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效 (可以强制使用索引)

最后 : 谢谢小伙伴们的支持,转发,点赞,要努力过100,继续给大家带来有关面试的知识,做好不被面试官锤打的准备

面试题千变万化,为什么总是会问MySQL?的更多相关文章

  1. PHP訪问MySql数据库 0基础篇

    在站点后台,常常要与数据库打交道.本文介绍怎样使用XAMPP来管理MySql数据库及怎样用PHP来訪问MySql数据库. 一.使用XAMPP来管理MySql数据库 首先使用XAMPP打开MySql的管 ...

  2. PHP的MySQL扩展:PHP訪问MySQL的经常使用扩展函数

    来源:http://www.ido321.com/1024.html 一.PHP连接数据库及基本操作 MySQL採用的是'客户机/server'架构.使用PHP安装的MySQL扩展函数,和直接使用cl ...

  3. mysql的安装、C++訪问mysql数据库、编码设置问题

    一.mysql的安装.这个相对简单,直接去官网下载mysql安装程序.就能够完毕安装过程,网上有非常多安装教程,这个没什么注意事项. 二.C++訪问mysql.主要是用到mysql定义的头文件,内部定 ...

  4. php訪问mysql数据库

    PHP訪问Mysql数据库 PHP能够通过mysql接口和mysqli接口訪问mysql数据库. 须要加入mysql和mysqli接口才干訪问mysql数据库. windows下配置amp: a.安装 ...

  5. 在nginx中使用lua直接訪问mysql和memcaced达到数据接口的统一

    安装nginx參见<nginx+lua+redis构建高并发应用> 让nginx 中的nginx_lua_module支持mysql 和memcache 下载 https://github ...

  6. 面试题Redis最常被问到知识点总结

    1.什么是redis? redis是一个高性能的key-value数据库,它是完全开源免费的,而且redis是一个NOSQL类型数据库,是为了解决高并发.高扩展,大数据存储等一系列的问题而产生的数据库 ...

  7. InputFormat,OutputFormat,InputSplit,RecordRead(一些常见面试题),使用yum安装64位Mysql

    列举出hadoop常用的一些InputFormat InputFormat是用来对我们的输入数据进行格式化的.TextInputFormat是默认的. InputFormat有哪些类型? DBInpu ...

  8. 面试常问MySQL性能优化问题

    知识综述: [1] MySQL中锁的种类: 常见的表锁和行锁,也有Metadata Lock等等,表锁是对一整张表加锁,分为读锁和写锁,因为是锁住整张表,所以会导致并发能力下降,一般是做ddl处理时使 ...

  9. C语言訪问MySQL数据库的方法

    1.加入头文件路径(MySQL安装路径中的include路径) 2.加入库文件(直接从MySQL安装路径中copy libmysql.lib就可以) 3.编程操作数据库 代码 // AccessToM ...

随机推荐

  1. idea 2018版/2019版的破解

    idea 2019版破解的穿越隧道:https://www.jianshu.com/p/09c9afae9a05 idea 2018版破解的穿越隧道:https://www.jianshu.com/p ...

  2. 多线程集成设计模式--future模式

    多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future.Master-Worker.Guard Susperionsion 一.什么是Future模型: 该模型是将异步请求和代理 ...

  3. 【贪心】Emergency Evacuation

    题目 大致题意 把指定的人从同一出口送出车外,且同一位置不能同时有两个人,求所需的最短时间. 分析 第一感觉就是利用贪心思想解决问题,但是这道题的数据范围用模拟的话肯定是会爆掉的,所以这是不可取的.我 ...

  4. AcWing 走廊泼水节 题解

    这道题大致题意就是让一棵树任意两点有连边(也就是完全图),但是补完后最小生成树是一开始的那棵树,问最小加的边权之和是多少. 了解题意后,我们可以想到用Kruskal(废话),当每两个集合合并的时候,除 ...

  5. day01微信小程序

    一.基本概要 1.一个程序接口,可以集成很多功能,也就是在程序上再次开发 腾讯:微信+小程序 阿里:支付宝  +小程序 小程序的使用量很多 2.为什么要微信小程序? 1.微信用户群体大 2.容易推广, ...

  6. java语言基础(八)_接口_多态

    接口 1. 接口定义的基本格式 接口就是多个类的公共规范,是一种引用数据类型,最重要的内容就是其中的:抽象方法. 如何定义一个接口的格式: public interface 接口名称 { // 接口内 ...

  7. Xshell如何连接

    Xshell如何连接

  8. CSS(二)- 选择器 - 伪元素和伪类(思维导图)

    伪元素 伪元素可以创建一些文档语言无法创建的虚拟元素.比如:文档语言没有一种机制可以描述元素内容的第一个字母或第一行,但伪元素可以做到(::first-letter.::first-line).同时, ...

  9. Video.js随笔记

    下载与介绍 Video.js是一款web视频播放器,支持html5和flash两种播放方式.更有自定义皮肤,插件,组件,语言还有丰富的选项配置. 官网下载地址:https://videojs.com/ ...

  10. Scala 基础(五):Scala变量 (二) 数据类型

    1 scala数据类型介绍 Scala 与 Java有着相同的数据类型,在Scala中数据类型都是对象,也就是说scala没有java中的原生类型 Scala数据类型分为两大类 AnyVal(值类型) ...