目录
5.什么是聚簇索引(聚集索引)什么是非聚簇索引(二级索引) ?
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.主从复制、读写分离
如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响 可以采用读写分离的架构。 读写分离解决的是,数据库的写入,影响了查询的效率。

回答
- 表的设计优化,数据类型的选择
- 索引优化,索引创建原则
- sql语句优化,避免索引失效,避免使用select * ….
- 主从复制、读写分离,不让数据的写入,影响读操作
- 分库分表
1758

被折叠的 条评论
为什么被折叠?



