MYSQL常见索引面试题及答案

索引的分类

1、唯一索引:确保数据唯一性

2、非唯一索引:这些字段可以重复,不要求唯一.

3、主键索引:是唯一索引的特定类型,创建主键时自动创建.

4、聚簇索引: 表中记录的物理顺与键值顺序相同,表数据和主键一起存储.

5、非聚簇索引: 表数据和索引分两部分存储

主键和唯一索引的区别?

1、主键一定会创建一个唯一索引,但是有唯一索引的列不一定是主键;
2、主键不允许为空值,唯一索引列允许空值;
3、一个表只能有一个主键,但是可以有多个唯一索引;
4、主键可以被其他表引用为外键,唯一索引列不可以;
5、主键是一种约束,而唯一索引是一种索引,是表的冗余数据结构,两者有本质的差别

都在哪些字段加索引?

1、表的主键、外键必须有索引

2、数据量超过300的表应该有索引

3、经常与其他表进行连接的表,在连接字段上应该建立索引

4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引

5、索引应该建在选择性高的字段上

怎么使用索引才能提高索引的命中?

1、如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

2、对于多列索引,不是使用的第一部分(第一个),则不会使用索引

3、如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

4、如果mysql估计使用全表扫描要比使用索引快,则不使用索引

索引的最左前缀了解吗?

索引index1:(a,b,c)有三个字段,索引是有序的,index1索引在索引文件中的排列是有序的,首先根据a来排序,然后才是根据b来排序,最后是根据c来排序

索引是越多越好吗?为什么?

1、合理的建立索引能够加速数据读取效率,不合理的建立索引会拖慢数据库的响应速度。

2、索引越多,更新数据的速度越慢。

不要在选择的栏位上放置索引,这是无意义的。应该在条件选择的语句上合理的放置索引,比如where,order by。
例子:
SELECT id,title,content,cat_id FROM article WHERE cat_id = 1;
上面这个语句,你在id/title/content上放置索引是毫无意义的,对这个语句没有任何优化作用。但是如果你在外键cat_id上放置一个索引,那作用就相当大了

索引的底层数据结构知道吗?推荐大家看看B-Tree和Hash,以及磁盘的存储结构?

B±Tree定义

其定义基本与B-Tree相同

除了:

1、非叶子节点的子树指针与关键字个数相同。

2、非叶子节点的子树指针p[i],指向关键字值(K[i],K[i+1])的子树。

3、非叶子节点仅用来做索引,数据都保存在叶子节点中。

4、所有叶子节点均有一个链指针指向下一个叶子节点。

数据库主从同步

1、MySQL半同步复制

MySQL的Replication默认是一个异步复制的过程,从MySQL5.5开始,MySQL以插件的形式支持半同步复制,我先谈下异步复制,这样可以更好的理解半同步复制。

1)异步复制

MySQL默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从库上。

2)半同步复制

对于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

2、数据库中间件

流程:

1)所有的读写都走数据库中间件,通常情况下,写请求路由到主库,读请求路由到从库

2)记录所有路由到写库的key,在主从同步时间窗口内(假设是500ms),如果有读请求访问中间件,此时有可能从库还是旧数据,就把这个key上的读请求路由到主库。

3)在主从同步时间过完后,对应key的读请求继续路由到从库。

发布了263 篇原创文章 · 获赞 137 · 访问量 7561

猜你喜欢

转载自blog.csdn.net/qq_44868502/article/details/103796942