sql索引连环炮

关系型数据库

mysql  oracle

每天几百万数据,你们有没有对查询做一些优化?

数据库建了一些索引

你能说说什么是索引吗

索引就是一种数据结构,能够帮助我们快速的检索数据库的数据

索引具体采用的哪种数据结构?

mysql数据库主要有两种:Hash索引和B+tree索引,我们使用的是InnoDB引擎,默认是B+tree

你知道InnoDB为什么采取B+树吗?这和Hash索引比较起来有什么优缺点?

Hash索引底层是哈希表,数据存储关系没有任何顺序关系,所以范围查询无法利用索引,会进行全表扫描。

B+tree节点是天然有序的,对范围查询不需要进行全表扫描。

亮点 :Hash索引不适合有大量重复键值的情况,因为存在hash碰撞问题。

聚簇索引、覆盖索引

你知道B+ Tree的叶子节点都可以存哪些东西吗?

InnoDB的B+ Tree可能存储的是整行数据,也有可能是主键的值。

聚簇索引和非聚簇索引在查询数据时候有啥区别?

聚簇索引查询会更快。因为主键索引查询只会查询一次,但非主键所以你需要回表查询多次。

刚刚你提到主键索引查询只会查一次,而非主键索引需要回表查询多次。(后来我才知道,原来这个过程叫做回表)是所有情况都是这样的吗?非主键索引一定会查询多次吗?

通过覆盖索引也可以只查询一次

 

你们在创建索引的时候都会考虑哪些因素呢?

我们一般对于查询概率比较高,经常作为where条件的字段设置索引

你们在创建联合索引的时候,需要做联合索引多个字段之间顺序你们是如何选择的呢?

在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。

 

你们创建的那么多索引,到底有没有生效,或者说你们的SQL语句有没有使用索引查询你们有统计过吗?

这个还没有统计过,除非遇到慢SQL的时候我们才会去排查

面试官:那排查的时候,有什么手段可以知道有没有走索引查询呢?

我:可以通过explain查看sql语句的执行计划,通过执行计划来分析索引使用情况

面试官:那什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢?

我:(依稀记得和优化器有关,但是这个问题并没有回答好)

科普时间——查询优化器 一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。 在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案。这个成本最低的方案就是所谓的执行计划。 优化过程大致如下: 1、根据搜索条件,找出所有可能使用的索引 2、计算全表扫描的代价 3、计算使用不同索引执行查询的代价 4、对比各种执行方案的代价,找出成本最低的那一个
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值