八股文---MySQl(2)

目录

3.了解过索引吗?(什么是索引)

回答:

4.索引的底层数据结构

回答:

5.什么是聚簇索引(聚集索引)什么是非聚簇索引(二级索引) ?

回答:

6.知道什么是回表查询嘛 ?

回答

7.知道什么叫覆盖索引嘛 ? 

回答

8.MySql的超大分页怎么处理

回答

9.索引创建的原则有哪些?

回答

10.什么清空下索引会失效

回答

11.谈谈你对sql的优化的经验

1.表的设计优化(参考阿里开发手册《嵩山版》)

2.SQL语句优化

3.主从复制、读写分离

回答



3.了解过索引吗?(什么是索引)

索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引

回答:

  • 索引(index)是帮助MySQL高效获取数据的数据结构(有序)
  • 提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)
  • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗

4.索引的底层数据结构


数据库的数据结构:

回答:

MySQL的InnoDB引擎采用的B+树的数据结构

  • 来存储索引 阶数更多,路径更短

  • 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据

  • B+树便于扫库和区间查询,叶子节点是一个双向链表

5.什么是聚簇索引(聚集索引)什么是非聚簇索引(二级索引) ?

分类

含义

特点

聚集索引(Clustered Index)

将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据

必须有,而且只有一个

二级索引(Secondary Index)

将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键

可以存在多个

聚集索引----必须有,而且只有一个

二级索引----可以存在多个

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

回答:

聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个 非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个

6.知道什么是回表查询嘛 ?

这个sql语句实际步骤:

1.由于给name添加了二级索引所以会先走二级索引

2.先到二级索引的根节点Lee比对,最后定位到Arm

3.拿到Arm数据中10,在到聚集索引中查找

4.在进行比对,最后找到10,找到10叶子节点得到整行数据。

5.查找成功

回答

通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表

7.知道什么叫覆盖索引嘛 ? 

覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。

回答

覆盖索引是指查询使用了索引,返回的列,必须在索引中全部能够找到

  • 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
  • 如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *

8.MySql的超大分页怎么处理

在数据量比较大时,如果进行limit分页查询,在查询时,越往后,分页查询效率越低。

我们一起来看看执行limit分页查询耗时对比:

因为,当在进行分页查询时,如果执行 limit 9000000,10 ,此时需要MySQL排序前9000010 记录,仅仅返回 9000000 - 9000010 的记录,其他记录丢弃,查询排序的代价非常大 。


优化思路: 一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化

最后可以看到输出结果只需要7秒左右

回答

可以使用覆盖索引解决和子查询---比如先分页查询获取表达id,对表id排序,再通过id去原来的表中做关联查询

9.索引创建的原则有哪些?

  • 先陈述自己在实际的工作中是怎么用的
  • 主键索引
  • 唯一索引
  • 根据业务创建的索引(复合索引)

1). 针对于数据量较大,且查询比较频繁的表建立索引。

2). 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。

3). 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。

4). 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引

5). 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。

6). 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。

7). 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

回答

1). 数据量较大,且查询比较频繁的表                                    重要

2). 常作为查询条件、排序、分组的字段                                重要

3). 字段内容区分度高

4). 内容较长,使用前缀索引

5). 尽量联合索引                                                                    重要

6). 要控制索引的数量                                                             重要

7). 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

10.什么清空下索引会失效

索引失效的情况有很多,可以说一些自己遇到过的,不要张口就得得得说一堆背诵好的面试题 (适当的思考一下,回想一下,更真实)

1). 违反最左前缀法则 如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。

2). 范围查询右边的列,不能使用索引

3). 不要在索引列上进行运算操作, 索引将失效。

4). 字符串不加单引号,造成索引失效。---自动的类型转换,都会失效

5).以%开头的Like模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

回答

1).违反最左前缀法则

2).范围查询右边的列,不能使用索引

3).不要在索引列上进行运算操作, 索引将失效 字符串不加单引号,造成索引失效。(类型转换)

4).以%开头的Like模糊查询,索引失效

11.谈谈你对sql的优化的经验

1.表的设计优化(参考阿里开发手册《嵩山版》)

  • 比如设置合适的数值(tinyint   int   bigint),要根据实际情况选择
  • 比如设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度,效率稍低

2.SQL语句优化

  • SELECT语句务必指明字段名称(避免直接使用select * )
  • SQL语句要避免造成索引失效的写法
  • 尽量用union all代替union   union会多一次过滤,效率低
  • 避免where子句中对字段进行表达式操作
  • Join优化 能用innerjoin 就不用left join right join,如必须使用 一定要以小表为驱动,内连接会对两个表进行优化,优先把小表放到外边,把大表放到里边。left join 或 right join,不会重新调整顺序

3.主从复制、读写分离

如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响 可以采用读写分离的架构。 读写分离解决的是,数据库的写入,影响了查询的效率。

回答

  1. 表的设计优化,数据类型的选择
  2. 索引优化,索引创建原则
  3. sql语句优化,避免索引失效,避免使用select *  ….
  4. 主从复制、读写分离,不让数据的写入,影响读操作
  5. 分库分表
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值