【面试】数据库

本文深入探讨了数据库的优化策略,包括表结构、字段和索引的优化,强调了索引在提高查询效率方面的重要性。介绍了InnoDB存储引擎的特性,如事务支持、行级锁定和数据组织方式,并对比了MyISAM引擎。此外,还讨论了Redis的适用场景,如缓存、队列、去重和排名。同时,提到了哈希索引的优缺点及其局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库
1.你对数据库做了哪些优化
2.你对数据库的索引了解吗
3.你们数据库用的什么存储引擎,为什么用这个引擎
4.innodb他为什么查询数据快
5.你知道索引的原理吗,为什么用了索引就比较快
6.mysql存储引擎
7.你们有遇到数据库方面的瓶颈吗
8.redis的数据结构和优化
9.数据库分库,1个库要拆成n个库
10.sql select区分大小写吗
11.索引的类型 
12.联合查询需要每个字段建立索引吗
13.redis做排行榜什么容器
14.Redis适合做什么

优化
表结构,字段,索引,减少存储的数据,封装接口

索引
如果没有使用索引,相当于从前往后整个表进行查找。而使用索引,相当于拥有了一个目录,可以大大加速查找。
创建索引的过程可以理解为数据库额外创建了一个文件(某种格式存储),作为目录。在查找时,先在这个目录中查找。即存储引擎先再索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。

索引的种类
普通索引,加速查找
主键索引,加速查找 + 不能为空 + 不能重复
唯一索引,加速查找 + 不能重复
组合索引,多列组成一个索引
联合主键索引
联合唯一索引
联合普通索引
以及两种特殊索引名词
(覆盖索引)能直接在索引文件获取到数据
select id from tb where id = 1;
(索引合并)多个单列索引合并使用
select * from tb where id=1 and name='xixi';
组合索引效率 > 索引合并

参考资料:https://www.jianshu.com/p/b55126bf656c

InnoDB是默认的数据库存储引擎,他的主要特点有:
(1)可以通过自动增长列,方法是auto_increment。
(2)支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。
(3)使用的锁粒度为行级锁,可以支持更高的并发;
(4)支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。
(5)配合一些热备工具可以支持在线热备份;
(6)在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;
(7)对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
当然InnoDB的存储表和索引也有下面两种形式:
(1)使用共享表空间存储:所有的表和索引存放在同一个表空间中。
(2)使用多表空间存储:表结构放在frm文件,数据和索引放在IBD文件中。分区表的话,每个分区对应单独的IBD文件,分区表的定义可以查看我的其他文章。使用分区表的好处在于提升查询效率。
对于InnoDB来说,最大的特点在于支持事务。但是这是以损失效率来换取的。

MyISAM
支持数据压缩,说明肯定也支持这个格式。在数据文件发生错误时候,可以使用check table工具来检查,而且还可以使用repair table工具来恢复。
有一个重要的特点那就是不支持事务,但是这也意味着他的存储速度更快,如果你的读写操作允许有错误数据的话,只是追求速度,可以选择这个存储引擎。

MySQL中,只有Memory引擎显式支持哈希索引。
因为索引只存储对应的哈希值,所以索引的结构十分紧凑,这也让哈希索引查找的速度非常快。
但是哈希索引包含以下缺点:
1.哈希索引只包含哈希值和行指针,而不存储数据值,所以无法通过索引来避免读取行。(当select只取索引值时)
2.哈希表中的哈希值是有序的,但导致索引值是无序的,所以无法用于排序
3.哈希索引不支持部分索引列匹配索引。因为哈希值是根据所有使用的索引列进行计算。所以当索引为(A,B)时,如果只使用A,索引无效。
4.哈希索引只支持等值查询。即 = 、 IN()、 <=>。不支持范围查询
5.当出现哈希冲突时,需要遍历对应链表的所有行指针,逐行比较。
6.如果哈希冲突很多时,一些索引维护操作的代价也会很高。例如当做对应的删除操作时,需要遍历对应链表的所有行指针,找到并删除对应行的引用。

Redis适合做什么
使用Redis做缓存
Redis的字符串、哈希表两种数据结构适合用来储存大量的键值对信息,从而实现高速缓存。
2.使用Redis做队列
Redis 有多几种数据结构适于做队列:
使用“列表”数据结构,可以实现普通级和优先级队列的功能。
使用“ 有序集合”数据结构,可以实现优先级队列: .使用“哈希表”数据结构,可以实现延时队列。
3.使用Redis去重
Redis 有多几种数据结构适于做去重:
利用“集合”数据结构,可以实现小批量数据的去重:
利用“字符串” 数据结构的位操作,可以实现布隆过滤器,从而实现超大规模的数据
去重:
利用Redis 自带的HyperLogLog 数据结构,可以实现超大规模数据的去重和计数。
4.使用Redis实现排名
Redis 的“ 有序集合”功能可以实现积分板功能,还能实现自动排序、排名功能。
5.使用Redis实现“发布/订阅”功能
Redis 自带的“发布/订阅”模式可以实现多对多的“ 发布/订阅”功能

Redis的有序集合ZSet数据类型
有序集合和散列一样,用于存储键值对;有序集合的键被称为成员member,每一个成员都是独一无二的;而有序集合的值被称为分值score,分值必须是浮点数。
有序集合是Redis里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排序来访问元素的结构。
一个有序集合类型的实例,zset-key是一个包含两个元素的有序集合键

关闭redis
# redis-cli shutdown
设置密码
# requirepass foobared
requirepass yourpassword  //此处注意,行前不能有空格
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值