面试题答案
一键面试索引使用
- 分析查询:仔细分析频繁执行的查询语句,确定哪些字段经常用于
WHERE
、JOIN
等条件中。例如,如果经常通过user_id
来查询订单信息,那么在订单表的user_id
字段上添加索引。 - 复合索引:当多个字段联合用于查询条件时,创建复合索引。比如查询同时涉及
created_at
和status
字段,创建一个包含这两个字段的复合索引CREATE INDEX idx_created_at_status ON orders (created_at, status)
。但要注意复合索引的字段顺序,将选择性高(即重复值少)的字段放在前面。 - 覆盖索引:如果查询只涉及部分字段,并且这些字段都包含在某个索引中,使用覆盖索引可以避免回表操作。例如查询只需要
product_id
和price
字段,且有一个包含这两个字段的索引,数据库可以直接从索引中获取数据,而无需再到表中查找。
缓存机制
- 查询缓存:利用库提供的缓存功能,对频繁执行且结果不经常变化的查询进行缓存。例如,对于获取网站统计信息的查询,这些数据可能一天更新一次,就可以缓存该查询结果。可以使用内存缓存如Redis,将查询语句作为键,查询结果作为值存储。每次执行查询前,先检查缓存中是否存在对应结果,如果存在则直接返回。
- 对象缓存:对于从数据库获取的对象,缓存整个对象。比如在用户信息查询中,将获取到的用户对象缓存起来。当下次需要相同用户信息时,直接从缓存中获取对象,而不是再次查询数据库。可以使用类似Memcached这样的缓存系统,根据对象的唯一标识(如用户ID)作为键来存储和获取对象。
- 缓存失效策略:设置合理的缓存失效时间,确保缓存数据的时效性。对于不经常变化的数据,可以设置较长的失效时间;对于变化频繁的数据,设置较短的失效时间。另外,当数据库中的数据发生变化时(如数据更新、删除操作),要及时清除相关的缓存数据,保证数据一致性。例如,当用户信息更新后,删除缓存中该用户的信息缓存。