MySQL面试题

MySQL 有几种索引? 按字段特性分,按物理存储分呢? 索引底层有几种实现呢? MySQL 的有哪几种存储引擎? InnoDB 和 MyISAM 有什么区别?有什么优缺点?

MySQL中有多种类型的索引,根据字段特性分和物理存储分可以总结如下:

按字段特性分:
  1. 主键索引:用于唯一标识每一行数据,每张表只能有一个主键索引。
  2. 唯一索引:确保索引列中的值是唯一的,但允许有空值。
  3. 普通索引:普通的索引,没有唯一性限制,可以有重复值。
  4. 全文索引:主要用于全文搜索,适用于大文本字段的搜索。
  5. 空间索引:用于地理空间数据类型的字段,如经纬度坐标。
按物理存储分:
  1. B-Tree索引:这是最常见的索引类型,适用于主键、唯一索引和普通索引。
  2. 哈希索引:用于内存表,不支持范围查找,只能用于等值查找。
  3. R-Tree索引:用于空间索引,主要用于地理信息系统。
索引底层实现:

索引的底层实现通常包括B-Tree、B+Tree和Hash等数据结构。B-Tree是最常见的底层实现,它支持范围查询,适用于大多数索引。

存储引擎:

MySQL支持多种存储引擎,其中常见的包括:

  1. InnoDB:支持事务、外键约束、行级锁等特性,适合于需要数据完整性和并发性的应用,是MySQL默认的存储引擎。
  2. MyISAM:不支持事务,但具有较高的插入和查询速度,适合于读多写少的应用。
  3. MEMORY:数据存储在内存中,读写速度非常快,但数据不持久化,断电后数据丢失。
  4. NDB Cluster:用于MySQL Cluster,支持分布式数据库,具有高可用性和容错特性。
  5. Archive:用于归档数据,不支持更新操作,适合于只读数据。

InnoDB和MyISAM是最常见的存储引擎,它们的主要区别和优缺点如下:

InnoDB:

  • 支持事务,具有ACID特性,适合于需要数据完整性和并发性的应用。
  • 支持行级锁,适合高并发环境。
  • 外键约束,保证数据一致性。
  • 支持热备份和恢复。
  • 数据存储在表空间中,支持大容量数据。

MyISAM:

  • 不支持事务,不具备ACID特性。
  • 表级锁,对于并发处理能力有限。
  • 不支持外键约束。
  • 不支持热备份,需要额外的工具支持。
  • 数据存储在MYD、MYI文件中,不适合大容量数据。

选择存储引擎取决于应用的需求,如果需要事务支持和数据完整性,通常选择InnoDB。如果对读操作性能要求较高,可以考虑MyISAM。不同存储引擎在不同的应用场景中有各自的优劣势。

什么叫回表查询? 如果没有创建主键,怎么进行回表查询?

回表查询是数据库查询操作中的一种,它发生在索引无法覆盖查询所需的数据时。当一个查询需要检索的数据无法完全从索引中获取时,数据库系统必须通过索引查找到主键,然后使用主键再次查询表中的数据,这个额外的查询过程称为回表查询。回表查询增加了查询的成本,因为它需要额外的I/O操作和索引查找。

如果没有创建主键,回表查询的过程会略有不同。在没有主键的情况下,数据库系统会使用一个唯一索引(如果存在的话)来定位行,而不是使用主键。如果没有唯一索引可用,数据库将使用聚集索引或表扫描来查找行。

总的来说,无论是否有主键,回表查询都意味着额外的查询操作,这会影响查询性能。因此,通常建议为表添加主键,以便优化查询性能。主键可以是自增字段或具有唯一性约束的字段。主键不仅帮助唯一标识每一行数据,还可以提高检索效率。

Redis 数据库怎么是实现持久化的 ?Redis 里边都有哪些数据类型? ZSet 怎么用?

Redis实现持久化有两种主要的方法:

  1. 快照持久化(Snapshotting):快照持久化是通过保存数据在某个时间点的快照来实现的。Redis会周期性地将内存中的数据集以快照的方式写入磁盘,保存到一个文件中。这个文件通常以RDB文件的形式存在。当Redis重新启动时,可以加载这个RDB文件来恢复数据。
    • 优点:快速,适用于大数据集的备份和恢复。
    • 缺点:如果Redis宕机时没有及时持久化,可能会导致数据丢失。
  1. 追加文件持久化(Append-Only File):追加文件持久化是将每次写操作追加到一个日志文件(AOF文件)中,以记录每次操作。当Redis重新启动时,可以通过重放AOF文件中的操作来恢复数据。
    • 优点:数据不易丢失,适用于需要数据完整性的场景。
    • 缺点:AOF文件可能会变得很大,恢复速度相对较慢。

Redis支持的数据类型包括:

  1. String(字符串):最常用的数据类型,可以包含文本、数字等。
  2. List(列表):一个有序的字符串元素集合,可以进行插入、删除、修剪等操作。
  3. Set(集合):包含不重复元素的无序集合,可以进行交集、并集、差集等操作。
  4. Sorted Set(有序集合):类似Set,但每个元素都关联一个分数,可以进行按分数排序的操作。
  5. Hash(哈希表):类似关联数组或字典,可以存储多个键值对。
  6. Bitmaps(位图):用于位操作的特殊字符串类型,可用于处理一些统计问题。
  7. HyperLogLog(基数估计):用于估算大数据集合的基数(不重复元素的数量)。
  8. Geospatial(地理空间索引):支持地理位置信息的存储和操作。
  9. Streams(流):用于消息队列等有序事件的数据结构。

ZSet(有序集合)是一种有序的集合,其中的每个元素都关联一个分数(score),可以根据分数来排序元素。ZSet经常用于需要按分数排序的场景,如排行榜、优先队列等。你可以使用Redis提供的命令来操作ZSet,包括添加元素、删除元素、按分数范围获取元素等。下面是一个示例:

shellCopy code
# 添加元素到ZSet
ZADD myzset 90 "Alice"
ZADD myzset 80 "Bob"
ZADD myzset 95 "Charlie"

# 获取按分数排序的元素
ZRANGE myzset 0 -1

上述示例首先向名为myzset的ZSet添加了三个元素,然后使用ZRANGE命令按分数范围获取了所有元素,结果将按分数从低到高排序。

ZSet是一个非常有用的数据结构,特别适合需要排序的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1b( ̄▽ ̄)d 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值